Linux / Unix Bash betiği kendi PID'sini nasıl biliyor?


150

Bash adlı bir komut dosyası var Script.shve kendi PID bilmek gerekir (yani Script.sh içinde PID almak gerekir)

Bunun nasıl yapılacağı hakkında bir fikrin var mı?

Yanıtlar:



66

kullan $BASHPIDya da$$

İkisi arasındaki farklar da dahil olmak üzere daha fazla bilgi için kılavuza bakın .

TP; DRTFM

  • $$ Kabuğun işlem kimliğine genişler.
    • Alt ()kabukta, alt kabuğa değil, çağıran kabuğun işlem kimliğine genişler.
  • $BASHPID Geçerli Bash işleminin işlem kimliğine genişler.
    • Alt ()kabukta, alt kabuğun işlem kimliğine genişler

10
$$ ve BASHPID'in her zaman aynı şey olmadığını unutmayın - kılavuzda bundan bahsediliyor ve burada daha somut bir örnek var: tldp.org/LDP/abs/html/internalvariables.html . Birçok bash yapısı alt kabuklarda çalıştığından, bu fark oldukça önemli olabilir.
Cascabel

@Jefromi - not edildi. Bu el kitabına bağlanma nedenlerimden biriydi.
tvanfosson

2
$BASHPIDBASH 4 için yeni olduğuna dikkat edilmelidir. BASH 3.x kullanıyorsanız, kullanmanız gerekir$$
Bruno Bronosky

37

Jefromi tarafından başvurulan Gelişmiş Bash Komut Dosyası Kılavuzu'nda verilen örneğe ek olarak , bu örnekler boruların nasıl alt kabuklar oluşturduğunu gösterir:

$ 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

"<<<" ne anlama geldiğini açıklar mısınız? Teşekkürler.
Sopalajo de Arrierez

4
Bir dizeyi döngüye (veya okunan herhangi bir şeye stdin) yönlendirir. Dizeye "burada dizge" denir.
sonraki duyuruya kadar duraklatıldı.

8

PID, içinde saklanır $$.

Örnek: kill -9 $$çağrıldığı kabuk örneğini öldürür.


kill -9( -9bayraklı) zararlı olarak kabul edilir ve sadece kesinlikle gerekliyse kullanılır).
Willem Van Onsem

3
"Tehlikeli" olarak kabul edilir, çünkü işlem sinyale cevap verme şansı bulmaz (ve muhtemelen kendi kendini temizler). Yapmak kill -9 $$tam olarak 1 şey yapar. Mevcut kabuk işlemini öldürür . Bu, kabuk oturumunda yazılı olmasını istemediğiniz bir şey yaptıysanız faydalıdır .bash_history:docker run -e PASSWORD=hunter2 ircbot
Bruno Bronosky


0

İşlem bir alt işlemse ve $ BASHPID ayarlanmamışsa, çalışan işlemin oluşturulan bir alt işleminin ppid'ini sorgulamak mümkündür. Biraz çirkin olabilir, ama işe yarıyor. Misal:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.