Saya memiliki dua sistem Linux yang berkomunikasi melalui soket (Desktop dan papan pengembangan berbasis ARM).
Saya ingin me-restart (atau mengatur ulang) aplikasi klien saya (yang berjalan di papan pengembangan) ketika server mengirimkan pesan tertentu yang telah ditentukan sebelumnya. Saya tidak ingin me-restart (reboot) Linux, saya hanya ingin aplikasi klien me-restart sendiri secara otomatis.
Saya tidak dapat memahami bagaimana hal itu harus dilakukan.
Buatlah klien Anda mengeksekusi /proc/self/exe
ketika menerima pesan paticular itu. Anda tidak perlu tahu di mana eksekusi sebenarnya berada dalam sistem berkas. Dan anda dapat menggunakan kembali main()
's argv
untuk membuat vektor argumen baru.
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char buf[32] = {};
char *exec_argv[] = { argv[0], buf, 0 };
int count = argc > 1 ? atoi(argv[1]) : 0;
printf("Running: %s %d\n", argv[0], count);
snprintf(buf, sizeof(buf), "%d", count+1);
sleep(1);
execv("/proc/self/exe", exec_argv);
/* NOT REACHED */
return 0;
}
restart.c
ini berjalan seperti ini:
$ gcc restart.c
$ ./a.out 3
Running: ./a.out 3
Running: ./a.out 4
Running: ./a.out 5
Cara normal untuk melakukan ini adalah dengan membiarkan program Anda keluar, dan menggunakan sistem monitoring untuk me-restart-nya. Program init
menawarkan sistem monitoring seperti itu. Ada banyak program init yang berbeda (SysVinit, BusyBox, Systemd, dll.), dengan mekanisme konfigurasi yang sangat berbeda (selalu menulis file konfigurasi, tetapi lokasi dan sintaks file berbeda), jadi carilah dokumentasi dari program yang Anda gunakan. Konfigurasikan init untuk meluncurkan program Anda pada waktu boot atau atas permintaan eksplisit, dan untuk me-restart jika program mati. Ada juga program monitoring yang lebih bagus, tetapi Anda tidak membutuhkannya. Pendekatan ini memiliki banyak keuntungan dibandingkan dengan meminta program melakukan restart dengan sendirinya: pendekatan ini standar, sehingga Anda dapat me-restart banyak layanan tanpa harus peduli bagaimana program itu dibuat; pendekatan ini bekerja bahkan jika program mati karena bug.
Ada mekanisme standar untuk memberitahu sebuah proses untuk keluar: sinyal. Kirimkan program Anda sinyal TERM. Jika program Anda perlu melakukan pembersihan, tulislah signal handler. Itu tidak menghalangi adanya perintah khusus program untuk mematikannya jika Anda memiliki saluran administratif untuk mengirimkan perintah seperti ini.
Jika aplikasi klien adalah layanan Linux, aplikasi ini bisa di-restart dengan perintah ini:
service <clientapp> restart
atau dipaksa untuk memuat ulang konfigurasinya:
service <clientapp> reload
service <clientapp> force-reload
Jika, kemungkinan besar, ini adalah aplikasi kustom, aplikasi ini harus memiliki fitur yang tertanam dalam kodenya untuk memulai ulang sendiri atau memuat ulang konfigurasinya setelah menerima sinyal atau peristiwa. Jika gagal melakukannya, sebagai upaya terakhir, Anda selalu dapat mematikan aplikasi klien:
pkill -9 <clientapp>
dan memulai ulang lagi, tetapi itu jelek karena meninggalkan aplikasi dalam keadaan yang tidak ditentukan.