Apakah sinyal 0 pada perintah trap?


12

Saya mengikuti panduan ini tentang cara mengatur otentikasi SSH tanpa kata sandi dengan ssh-agent.

Untuk memulai ssh-agent, penulis merekomendasikan kode berikut dalam .bash_profile:

SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
    eval `$SSHAGENT $SSHAGENTARGS`
    trap "kill $SSH_AGENT_PID" 0
fi

Saya tidak mengerti mengapa ini menjebak sinyal 0. Menurut sinyal manusia 7 tidak ada sinyal seperti itu.

Apakah ini hanya kesalahan ketik atau bug atau apakah ini benar-benar mencapai sesuatu?

Jawaban:


19

Dari manual bash :

trap [-lp] [[arg] sigspec ...]

... Jika sigspec adalah EXIT (0) perintah arg dieksekusi saat keluar dari shell.


13
Benar. Jika pembaca datang ke sini karena judul pertanyaan, perhatikan bahwa ini adalah makna dari perintah 0shell trap. Ketika mengirim sinyal dengan kill, nomor sinyal 0 berarti tidak mengirim sinyal sama sekali; ini adalah cara menguji keberadaan proses target.
Gilles 'SANGAT berhenti menjadi jahat'

@Mat: Terima kasih banyak. Saya sedang membaca jebakan manusia 1 ...
Christoph Wurm

1
Tapi itu tidak ada dalam daftar keluaran oleh trap -l!
amphetamachine

bisakah Anda mengatasi kasus ini ketika skrip bersumber?
Eric

1

Seperti yang ditunjukkan @Mat dalam jawabannya, SIGSPEC 0, saat digunakan pada trapperintah akan menyebabkan trapperintah dijalankan ketika skrip keluar.

Contoh ini menggambarkan apa yang terjadi.

$ cat tr.bash 
#!/bin/bash

echo "PID: $$"

trap 'echo hi; exit 1' 0 1 2 15

while [ 1 ]; do
    sleep 3
done

Ketika kami menjalankan ini:

$ ./tr.bash 
PID: 24086

Itu duduk di sini menunggu tanpa batas. Di jendela lain jika sekarang kami mengirim killsinyal ke sana Anda akan melihat bahwa a kill -0tidak akan membunuh proses, meskipun sinyal 0 tercantum dalam trapperintah.

$ kill -0 $(pgrep tr.bash)
$

Namun jika kita killscript menggunakan sinyal 1, kill -1:

$ kill -1 $(pgrep tr.bash)
$

Kita akan melihat bahwa skrip keluar, dan mencetak pesan, "hai" 2 kali. Yang pertama untuk sinyal 1, dan yang kedua karena skrip keluar.

$ ./tr.bash 
PID: 24086
hi
hi

0

trap on 0 dijalankan ketika shell keluar. Ini biasanya digunakan untuk membersihkan file tmp di satu tempat yang selalu dijalankan:

tmp = / tmp / myscript. $$

trap 'rm -f $ tmp; keluar '0 1 2 15

do_a_bunch_of_stuff

keluar

pintu keluar di ujung perangkap keluar dari shell saat pembersihan dengan status yang benar.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.