En son çalıştırılan komutun kabuk komut dosyasındaki pid'i nasıl alınır?


254

Bunun gibi bir kabuk betiği istiyorum:

my-app &
echo $my-app-pid

Ancak, sadece idam edilen emrin karşılığını nasıl aldım bilmiyorum.

jobs -p my-appPid'i almak için sadece bu komutu kullanabileceğimi biliyorum . Ancak kabuğu birkaç kez çalıştırmak istersem, bu yöntem işe yaramaz. Çünkü yeri belirsiz.

Yanıtlar:


338

Son çalıştırılan komutun PID'si $!kabuk değişkeninde:

my-app &
echo $!

1
Örn. [1] 893. Sadece sayı istiyorum
user3153014 4:14

33
Bunun arka planda başlatılan programlar anlamına geldiğine dikkat edilmelidir . Herhangi bir arka plan işlemi başlatılmadıysa, parametre ayarlanmamıştır.
ramrunner

5
Başka bir layık çözüm önerildi (bir cevaba yapılan bir yorumda) Yeni başlayan sürecin nasıl ödeneceği: oh ve "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24 Kas 10 '10 'de saat 14:28
imz - Ivan Zakharyaschev

14
@ user3153014 "[2] 2625" gibi s dizeleri, arka plan görevini başlattıktan sonra kabuk ile yazdırılıyor. Bu echo $!
çıkarımla

Genellikle böyle bir kodu bir komutta işlem bitene kadar beklemem gerektiğinde kullanırım. my-app & myVar=$! ; fg. fgişlemi tekrar ön plana çıkarır. Daha sonra yazdırabilirim echo $myVarve uygulamanın zaten bitmiş olduğundan eminim.
Vrata Blazek

66

Al PID:

#!/bin/bash
my-app &
echo $!

PIDDeğişkenle kaydet :

#!/bin/bash
my-app &
export APP_PID=$!

Tüm örnekleri PIDmetin dosyasına kaydedin :

#!/bin/bash
my-app &
echo $! >>/tmp/my-app.pid

Çıktıyı, hataları ve PIDayrı dosyalara kaydetme:

#!/bin/bash
my-app >/tmp/my-app.log 2>/tmp/my-app.error.log &
echo $! >>/tmp/my-app.pid

echo "my-app PID's: $(cat /tmp/my-app.pid)"

3
Soru, yeniden yönlendirme hakkında bir şey sormadı, o zaman cevabınız çoğunlukla my-appbittiğinde ve belki de PID’inin daha sonra yeniden kullanılması durumunda dosyanızda kötü bilgileriniz olması dışında, cevabınız çoğunlukla kabul edilenle aynıydı . Bu cevabın mevcut kabul edilmiş cevaba gerçekten çok fazla değer kattığını sanmıyorum
Eric Renouf

@EricRenouf yayın güncellendi!
Eduardo Cuomo,

yararlı olabilecek başka bir türev. Bu PID'yi alır ve aynı zamanda (çoğunlukla) ön plan işlemi olarak sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?
görür

APP değil = main &PID'yi almanın bir yolu?
MrMesees

3

Gibi bir şey dene

pidof my_app >> /tmp/my_app.pid

1
harici komut ve yavaş, eğer sistem doğrudan PID verebiliyorsa, neden sadece bunu bulmak için tüm süreçleri araştırıyor? ve ayrıca, doğru bir değer alacağınızdan emin
olamazsınız

-4

Böyle bir şey dene:

 ps ef | grep "[m]y-app" | awk '{print $2}'

İşleminizin ilk harfini arasına yerleştirmek, işlemi listenizde [ ]alamadığınızdan emin olmanızı sağlar grep. Gerekirse kullanıcı adınıza bir de grep ekleyebilirsiniz.


9
Bu en iyi ihtimalle kırılgandır ve bir my-appkereden fazla çalıştırılırsa çalışmaz - davidshen84 özellikle bu cas için endişelenir.
Mat

2
Bu rotaya bile giderseniz pgrepbunun yerine kullanmalısınız .
Willem
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.