Yang ini agak sulit didapat, tetapi jika Anda melihat 2 halaman manual berikut, Anda akan melihat catatan berikut:
bunuh (1)
$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
bunuh (2)
$ man 2 kill
...
If sig is 0, then no signal is sent, but error checking is still performed;
this can be used to check for the existence of a process ID or process
group ID.
...
Jadi sinyal 0 sebenarnya tidak akan mengirim apa pun ke PID proses Anda, tetapi akan memeriksa apakah Anda memiliki izin untuk melakukannya.
Di mana ini bisa berguna?
Satu tempat yang jelas adalah jika Anda mencoba menentukan apakah Anda memiliki izin untuk mengirim sinyal ke proses yang sedang berjalan kill
. Anda dapat memeriksa sebelum mengirim kill
sinyal aktual yang Anda inginkan, dengan membungkus tanda centang untuk memastikan yang kill -0 <PID>
pertama diizinkan.
Contoh
Katakanlah suatu proses dijalankan oleh root sebagai berikut:
$ sudo sleep 2500 &
[1] 15693
Sekarang di jendela lain jika kita menjalankan perintah ini, kita dapat mengkonfirmasi bahwa PID sedang berjalan.
$ pgrep sleep
15693
Sekarang mari kita coba perintah ini untuk melihat apakah kita memiliki akses untuk mengirim sinyal PID melalui kill
.
$ if ! kill -0 $(pgrep sleep); then echo "You're weak!"; fi
bash: kill: (15693) - Operation not permitted
You're weak!
Jadi itu berfungsi, tetapi hasilnya bocor pesan dari kill
perintah bahwa kita tidak memiliki izin. Bukan masalah besar, cukup tangkap STDERR dan kirimkan ke /dev/null
.
$ if ! kill -0 $(pgrep sleep) 2>/dev/null; then echo "You're weak!"; fi
You're weak!
Contoh lengkap
Jadi kita bisa melakukan sesuatu seperti ini killer.bash
:
#!/bin/bash
PID=$(pgrep sleep)
if ! kill -0 $PID 2>/dev/null; then
echo "you don't have permissions to kill PID:$PID"
exit 1
fi
kill -9 $PID
Sekarang ketika saya menjalankan di atas sebagai pengguna non-root:
$ ~/killer.bash
you don't have permissions to kill PID:15693
$ echo $?
1
Namun ketika dijalankan sebagai root:
$ sudo ~/killer.bash
$ echo $?
0
$ pgrep sleep
$
trap
perintah Bash dan Bash dan 0 vs sinyal 0 darikill
: Apa sinyal 0 dalam perintah perangkap?