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 ?

Debugger
sumber

Jawaban:

234

Variabel '$$' berisi PID.

Paul Tomblin
sumber
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
tvanfosson
sumber
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
Dijeda sampai pemberitahuan lebih lanjut.
sumber
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.

neo
sumber
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
4

Anda bisa menggunakan $$variabel.

Klaus Byskov Pedersen
sumber
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 "$!")
Joakim J. Rapp
sumber