Bash betiği yalnızca başlattığı başka bir betiğin örneklerini öldürmelidir


11

Mevcut durumda, belirli bir 'call.sh' komut dosyası arka planda `` call.sh '' adlı başka bir komut dosyasını başlatır, diğer işlemleri gerçekleştirir, bir süre uyur ve sonra 'called.sh' ile a sonlandırır pkill called.sh. Bu iyi çalışıyor.

Daha sonra, call.sh'yi başlatmadan önce veya sonra, başka bir zamanda 'terminal.sh' yi diğer terminallerden bağımsız bir komut dosyası olarak başlatmak istiyorum. Bunlar bağımsız örneklerini olmamalı 'calling.sh' tarafından öldürülebilir.

Bunu nasıl başarabilirim? Sezgi, çağıran komut dosyasının, bu sırada çalışan diğer adlardan başlatılan işlemi söyleyebileceğini söylüyor.

Bir varyant olarak, "calling.sh", "called.sh" sembolik bağlantısı olan "called" da başlatabilir . Bu, yukarıdaki durumun yönetimini zorlaştırıyor mu? Sembolik bir bağlantı kullanmak için hangi özel önlemler ve ayarlamalar gerekir?


Yanıtlar:


27

Adı öldürmek için kullanmayın. Yana calling.shsenaryo daha sonra öldürmek istediğiniz işlemi çağırıyor, sadece kullanmak $!(dan man bash):

! Eşzamansız komut olarak yürütülen veya bgyerleşik olanı kullanarak arka plana en son yerleştirilen işin işlem kimliğine genişler

Yani, eğer böyle iseniz calling.sh:

called.sh &
## do stuff
pkill called.sh

Bunu şu şekilde değiştirin:

called.sh &
calledPid=$!
# do stuff
kill "$calledPid"

4
Bu çağrıldığı sürece çalışmalıdır. Sh kendi kendine ölmez, aksi takdirde pid yeniden kullanılabilir, sonuç olarak masum ve ilgisiz bir süreci öldürür.
Eugene Ryabtsev

2
@EugeneRyabtsev bu çok iyi bir nokta. Sanırım $calledPidüst PID'nin PID'si olup olmadığını da kontrol edebilirsiniz called.sh.
terdon

Cevabı güçlendirmek için, düşüncelerimi düzenlemek için yararlı bulduğum başka bir kaynak: mywiki.wooledge.org/ProcessManagement
XavierStuvw

18

Bunu seçmek zorunda kaldım ama senaryolardan pek çok kez; komut dosyaları karmaşık bir otomatik zamanlamanın parçası olarak çağrıldığında daha da eğlencelidir. pkillHangi komut dosyasının öldürüleceğini seçmek gibi bir şeye güvenmemelisiniz .

Calling.sh içinde başlattığınız işlerin PID'lerini kaydetmeli ve bunları PID tarafından açıkça öldürmelisiniz.

Inside calling.sh:

./called.sh &
called_pid=$!

# Later
kill $called_pid
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.