Pipeline'da daha önce PID komutunun alınması


11

inotifywaitBir dizini izlemek ve değişiklikler algılandığında eylemleri başlatmak için kullanmak bir bash komut dosyası yazıyorum . Gibi bir şey:

inotifywait -m ... | while read f; do something; done

Yana inotifywaitkendisi tarafından sonlandırmak değil, bu yazı durmayacaktır.

Bu yüzden planım inotifywait işleminin PID'sini almak, bir dosyaya kaydetmek ve daha sonra farklı bir işlemin daha sonra öldürmesini sağlamaktı:

inotifywait -m ... | { echo ??PID?? > pid-file; while ... }

Ama PID'yi nasıl alacağımı bilmiyorum. Bunu başarmanın basit bir yolu var mı? Başka bir yol sadece kabuk komut dosyasının PID $$dosyasını dosyaya kaydetmek ve tüm kabuk komut dosyasını öldürmek ama while döngüsünden sonra bazı temizlik yapmak istedim.

Kullanmayı denedim coprocve işe yarayacağını düşünüyorum ama gerekenden daha fazla komplikasyon gibi görünüyor.


Böyle bir şey kullanabilirsiniz ps -ef | grep processName | grep -v grep | awk '{2 $ yazdır}' | xargs öldürmek -9 `
Kiwy

@Kiwy - bu karışıklık yerine sadece bir pgrep inotifywait. Bu sana PID verecek, öldürecek pkill inotifwait.
slm

@slm sisteminize bağlı olarak grep ve ps neredeyse varken pgrep ve pkill olmayacak. Hoşgeldiniz
Kiwy

@Kiwy - şüpheli, bu araçlar oldukça yaygın. Ayrıca yapmak zorunda değilsiniz grep -v grep, bunun yerine ps -ef | grep [p]rocessname...aynı şeyi yaparsınız.
slm

1
@DavidsonChua - evet çalıştırılabilir adların daha fazlasıyla eşleşmeniz -fgerekiyorsa anahtarı kullanabilirsiniz .
slm

Yanıtlar:


6

Bir boru hattında, tüm süreçler aynı anda başlatılır , diğerlerinden daha önce olmayan bir süreç yoktur .

Şunları yapabilirsiniz:

(echo "$BASHPID" > pid-file; exec inotifywait -m ...) | while IFS= read -r...

Veya portatif olarak:

sh -c 'echo "$$" > pid-file; exec inotifywait -m ...' | while IFS= read -r...

Ayrıca, whiledöngüyü çalıştıran alt kabuk sona erdiğinde, bir inotifywaitdahaki sefere stdout'a bir şeyler yazdığında otomatik olarak öldürüleceğini unutmayın.


3

Döngüde işlem kimliğine ihtiyacınız varsa, önce yazdırın.

sh -c 'echo "$$"; exec inotifywait -m ...' | {
  read inotifywait_pid
  while IFS= read -r f; do
    
    if …; then kill "$inotifywait_pid"; break;
  done
}

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.