Beberapa program reguler saya mogok (secara teratur) dengan pesan "Sinyal yang ditentukan pengguna 1". Saya tahu ada nohupperintah, tetapi apakah ada nousr1perintah? Atau sesuatu yang akan melakukan sesuatu seperti nohuptetapi dengan USR1?
Beberapa program reguler saya mogok (secara teratur) dengan pesan "Sinyal yang ditentukan pengguna 1". Saya tahu ada nohupperintah, tetapi apakah ada nousr1perintah? Atau sesuatu yang akan melakukan sesuatu seperti nohuptetapi dengan USR1?
Jawaban:
Solusi hacky sederhana untuk memiliki utilitas analog nohup, tetapi untuk SIGUSR1, akan mendapatkan salinan sumber core , membongkar, lakukan
sed -i 's/SIGHUP/SIGUSR1/' /path/to/coreutils/src/nohup.c
, secara opsional juga mengubah nama file output
sed -i 's/nohup\.out/nousr1.out/g' /path/to/coreutils/src/nohup.c
, kompilasi sumber ini dan instal nohupbiner yang baru dikompilasi untuk /usr/bin/nousr1:
cp /path/to/coreutils/src/nohup /usr/bin/nousr1
Setelah ini, ketika saya memeriksa, sleep 1000keluar USR1, sementara nousr1 sleep 1000kebal terhadap sinyal ini.
nohup, by the way, adalah untuk memisahkan proses dari terminal sehingga tidak dikirim SIGHUPsejak awal. Bahwa itu juga mengatur penangan sinyal adalah bonus tambahan, tetapi seharusnya tidak perlu.
signal(SIGHUP,SIG_IGN);panggilan nohup.c, proses akan menerima SIGHUP. Apa nohupselain mengabaikan sinyal hanya membuka kembali stdin, stdout, stderr deskriptor sebagai file non-terminal. Itu tidak benar-benar memisahkan proses dari terminal dengan cara khusus apa pun. Yaitu, proses akan dikirim SIGHUPketika terminal ditutup. Di sisi lain ada bash, yang melakukan hal yang sama dengan disownperintah, tapi aku tidak yakin bagaimana itu dilaksanakan - mungkin dengan cara yang Anda maksud.
Bagaimana dengan perintah trapbuilt-in shell ?
trap 'echo "Thou shalt not USR1 me"' USR1
Anda perlu menggunakan bentuk trapperintah dengan argumen kosong. Coba ini:
trap '' SIGUSR1; myprogram
Ini akan mengabaikan sinyal SIGUSR1 yang sedang Anda coba lakukan. Meskipun saya setuju dengan para komentator bahwa mungkin ada lebih banyak yang terjadi di sini daripada yang terlihat.
Bentuk yang salah:
trap 'echo ...' SIGUSR1; myprogram
masih akan mengizinkan myprogramuntuk menerima SIGUSR1 tetapi shell kemudian akan mengeksekusi echodari trapperintah.
trap '' SIGUSR1; gvimdiff file1 file2dan Vim meninggal dengan "Vim: Tertangkap sinyal mematikan USR1".