Ada nohup, apakah ada perintah nousr1?

12

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?

pengguna2624632
sumber
3
Pertanyaan yang lebih baik mungkin adalah apa yang mengirimnya sinyal usr1 di tempat pertama? Jika tidak ada, pesan keluar mungkin hanya menyesatkan.
Hibah
2
Kedengarannya seperti Anda mungkin memiliki beberapa masalah serius dalam "program reguler" Anda ... cukup menonaktifkan sinyal mungkin tidak memperbaiki atau mengaktifkan aplikasi yang mendasarinya berfungsi dengan baik. Saya sangat menyarankan agar Anda memeriksa lingkungan Anda DENGAN SEKSAMA sebelum hanya menonaktifkan sesuatu.
mdpc
@Grant: Saya setuju. Apakah ada utilitas yang dapat memberi tahu saya apa yang mengirim sinyal-sinyal ini?
user2624632

Jawaban:

3

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.

Ruslan
sumber
Fungsionalitas utama 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.
Simon Richter
@SimonRichter Jika Anda menghapus 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.
Ruslan
Ini sepertinya bekerja dengan baik.
user2624632
8

Bagaimana dengan perintah trapbuilt-in shell ?

trap 'echo "Thou shalt not USR1 me"' USR1 
Janne Pikkarainen
sumber
Ide bagus, tapi tidak berhasil. Proses tetap keluar dengan "Sinyal yang ditentukan pengguna 1".
user2624632
Penangan sinyal (selain SIG_IGN dan SIG_DFL) tidak diwarisi oleh proses anak.
aecolley
2

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.

Adrian Pronk
sumber
Ini sepertinya bekerja dengan baik.
user2624632
Ups, saya berbicara terlalu cepat. Saya berlari trap '' SIGUSR1; gvimdiff file1 file2dan Vim meninggal dengan "Vim: Tertangkap sinyal mematikan USR1".
user2624632
Hmmm, melihat kode sumber di code.google.com/p/vim/source/browse/src/os_unix.c tampaknya VIM mengaktifkan kembali sinyal USR1 dan memperlakukannya sebagai kesalahan fatal. Satu-satunya harapan Anda tampaknya adalah jika Anda dapat membuat OS menolak untuk mengirimkan sinyal USR1. Saya tidak tahu apakah ada sesuatu di luar sana yang dapat menyediakan fungsionalitas itu.
Adrian Pronk
Info lebih lanjut di sini: stackoverflow.com/q/4515274/41861
Adrian Pronk
Adrian Pronk: bukan hanya Vim; itu juga Firefox, dan Aqualung, dan Thunderbird, dan beberapa lainnya. Tapi bukan aplikasi lain, seperti Konsole, yang berjalan selamanya.
user2624632