Bir bash çocuk sürecinin PID'si (imapsync) - nasıl elde edersiniz?


15

Herhangi biri bana bash'da yürütülen bir komutun PID'sinin nasıl alınacağını söyleyebilir mi?

Örneğin, imapsync'i çalıştıran bir bash betiğim var.

Komut dosyası öldürüldüğünde imapsync işlemi her zaman öldürülmez, bu nedenle imapsync'in PID'sini komut dosyamdan programlı olarak tanımlayabilmek istiyorum, böylece imapsync işlemini kendimi bir sinyal işleyicide öldürebilirim.

Peki, bir alt işlemin PID'sini üst bash komut dosyasından programlı olarak nasıl alabilirim?


1
"Pidof imapsync" hakkında nasıl? Bunun nesi var?
pitr

2
Pidof hakkında bir şey bilmiyordum. Ancak şimdi yaptığım gibi, bu senaryo için anlayabildiğim kadarıyla kullanışlı değil, çünkü pidof, verilen komutun tüm işlemlerini bir sisteme, diğer komut dosyalarına / kullanıcılara ait olanları bile döndürüyor gibi görünüyor. Buna ek olarak, imapsync aslında bir perl betiğidir, bu yüzden tekrar imapsync olmayan ve diğer kullanıcılara ait olabilecek işlemleri döndürmesi muhtemel bir pidof perl yapıyordum.
Jason Tan

Javier doğrudur. Bu sayfa ProcessManagement hakkında daha fazla bilgi sunacaktır .
sinping

Yanıtlar:


4

imapsync, pid'in nerede yazıldığını ayarlama seçeneğine sahiptir:

--pidfile: imapsync pid'in yazıldığı dosya.


FYI, bu soruya genel anlamda gerçekten cevap vermiyor, ama --pidfile argunu keşfettim ve etrafta biraz solgunluk ile şimdiye kadar yeterince iyiydi ..
Jason Tan

@JasonTan neden bir erkeğe balık pişirmeyi öğretir, ona lezzetli bir önceden pişirilmiş fileto verebilirsin, o yüzden geri döner ve seni daha fazlası için sallar, ha? eski yazı için özür dilerim, ama neden Javiers'ın bu cevabını kabul ediyorsunuz?
senkronize

46
any_command args &
my_child_PID=$!

IOW, tıpkı PID'nizi $$tutar gibi $!, en son yürütülen arka plan komutunun PID'sine sahiptir .


Teşekkürler, ama imapsync arka plan ve $ değil! imapsync çağrısından sonraki sinyalde veya sinyal işleyicinin ilk satırında yankılanırsam ayarlanmaz. :-(
Jason Tan

6
Çocuğu çatallandırır ve arka plan yaparsa, çocuğun PID'sini bir yere kaydetmek ebeveynin sorumluluğundadır. her zamanki uygulama onu bir yere kaydetmektir /var/run/whatever.pid. Belki de PID'yi bir yere kaydetmesini istemek için bir komut satırı seçeneği vardır; değilse, yazara sormak veya kendinizi uygulamak için bir özellik gibi görünüyor.
Javier

1
Arka plan üzerinde vurgu . Arka plana herhangi bir işlem yerleştirilmemişse (yani, ekli olarak &), $!değişken tanımsızdır.
Trevor

1
Daha benzer çözümler önerilmektedir (bir cevap) Yeni başlayan sürecin pid nasıl alınır ; Bu yanıta ek olarak, bir yorum var diyor: oh, ve "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24 Kasım '14 : 28
imz - Ivan Zakharyaschev

10

Bunun aksine pidof, pgrepPID'leri döndürdüğü işlemleri kısıtlamak için çeşitli seçenekler verilebilir. Özellikle yararlı olabilecek bir şey, mevcut işlemin PID'sini kullanarak PPID'ye dayanarak seçim yapmaktır.

pgrep -P $$ imapsync

imapsync'in PID'lerini yalnızca betiğinizin alt öğesi olmaları durumunda verir.


0

Anlık olarak arka planda imapsync koymaya, PID'yi almaya ve sonra ön planlamaya ne dersiniz ... Böyle bir şey:

imapsync &
pid=$!
wait $pid
retVal=$?
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.