Bagaimana skrip Linux / Unix Bash mengetahui PID-nya sendiri?


150

Saya memiliki skrip di Bash yang dipanggil Script.sh, dan perlu mengetahui PID-nya sendiri (yaitu saya harus memasukkan PID ke dalam Script.sh)

Ada ide bagaimana mengerjakan ini ?

Jawaban:



66

gunakan $BASHPIDatau$$

Lihat manual untuk informasi lebih lanjut, termasuk perbedaan di antara keduanya.

TL; DRTFM

  • $$ Memperluas ID proses dari shell.
    • Dalam sebuah ()subkulit, itu mengembang ke ID proses shell yang memohon, bukan subkulit.
  • $BASHPID Memperluas ID proses dari proses Bash saat ini.
    • Dalam sebuah ()subkulit, ia mengembang ke ID proses dari subkulit tersebut

10
Perhatikan bahwa $$ dan BASHPID tidak selalu sama - manual menyebutkan ini, dan ada contoh yang lebih konkret di sini: tldp.org/LDP/abs/html/internalvariables.html . Perbedaannya bisa sangat penting, karena banyak konstruksi bash berjalan dalam subkulit.
Cascabel

@ Jefromi - dicatat. Itulah salah satu alasan saya terhubung ke manual.
tvanfosson

2
Perlu dicatat bahwa $BASHPIDini baru untuk BASH 4. Jika Anda menggunakan BASH 3.x, Anda harus menggunakan$$
Bruno Bronosky

37

Selain contoh yang diberikan dalam Panduan Script Bash Lanjutan yang dirujuk oleh Jefromi , contoh ini menunjukkan bagaimana pipa membuat subkulit:

$ echo $$ $BASHPID | cat -
11656 31528
$ echo $$ $BASHPID
11656 11656
$ echo $$ | while read line; do echo $line $$ $BASHPID; done
11656 11656 31497
$ while read line; do echo $line $$ $BASHPID; done <<< $$
11656 11656 11656

bisa tolong jelaskan apa artinya "<<<"? Terima kasih.
Sopalajo de Arrierez

4
Ini mengalihkan string ke dalam loop (atau apa pun yang berbunyi stdin). String ini disebut sebagai "string di sini".
Dijeda sampai pemberitahuan lebih lanjut.

8

PID disimpan di $$.

Contoh: kill -9 $$akan membunuh contoh shell dari mana ia dipanggil.


kill -9(dengan -9bendera) dianggap berbahaya dan hanya digunakan jika benar-benar diperlukan).
Willem Van Onsem

3
Ini dianggap "berbahaya" karena prosesnya tidak mendapatkan kesempatan untuk menanggapi sinyal (dan mungkin membersihkan sendiri). Melakukan kill -9 $$tepat 1 hal. Itu membunuh proses shell saat ini . Ini berguna jika Anda telah melakukan sesuatu dalam sesi shell yang tidak ingin Anda tulis .bash_historySuka:docker run -e PASSWORD=hunter2 ircbot
Bruno Bronosky


0

Jika prosesnya adalah proses anak dan $ BASHPID tidak disetel, dimungkinkan untuk meminta ppid dari proses anak yang dibuat dari proses yang berjalan. Mungkin agak jelek, tapi berhasil. Contoh:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")
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.