PID procesu potomnego bash (imapsync) - jak go zdobyć?

15

Czy ktoś może mi powiedzieć, jak uzyskać PID polecenia wykonanego w trybie bash.

Np. Mam skrypt bash, który uruchamia imapsync.

Gdy skrypt zostanie zabity, proces imapsync nie zawsze zostaje zabity, dlatego chciałbym móc programowo zidentyfikować PID imapsync na podstawie mojego skryptu, aby sam mógł zabić proces imapsync w module obsługi sygnału.

Jak więc programowo uzyskać PID procesu potomnego z nadrzędnego skryptu bash?

Jason Tan
źródło
1
Co powiesz na „pidof imapsync”? Co jest z tym nie tak?
pitr
2
Nie wiedziałem o pidofie. Jednak teraz, gdy to robię, nie jest to przydatne w tym scenariuszu, o ile mogę stwierdzić, ponieważ pidof wydaje się zwracać wszystkie procesy danej komendy w systemie - nawet te, które są własnością innych skryptów / użytkowników. Ponadto imapsync jest w rzeczywistości skryptem perla, więc zrobiłbym pidof perl, który ponownie prawdopodobnie zwróci procesy, które nie są imapsync i mogą należeć do innych użytkowników.
Jason Tan
Javier ma rację. Na tej stronie znajdziesz więcej informacji na temat ProcessManagement .
grzeszy

Odpowiedzi:

4

imapsync ma opcję, aby ustawić, gdzie ma być zapisany jego pid:

--pidfile: plik, w którym zapisywany jest imapsync pid.

Gilles LAMIRAL
źródło
Dla twojej informacji tak naprawdę nie odpowiada na moje pytanie w ogólnym sensie, ale odkryłem argument --pidfile arg i trochę rozglądając się wokół niego było wystarczająco dobre ...
Jason Tan
@Jason: Po co uczyć mężczyznę łowić ryby, skoro można podać mu smaczny, wstępnie ugotowany filet, więc wraca i dręczy cię na jutro, prawda? przepraszam za stary post, ale po co przyjmować tę odpowiedź w stosunku do odpowiedzi Javiera?
niezsynchronizowany
46
any_command args &
my_child_PID=$!

IOW, podobnie jak $$posiada PID, $!ma PID ostatnio wykonanego polecenia w tle .

Javier
źródło
Dzięki, ale imapsync nie jest w tle i $! nie jest ustawiane, jeśli echo w następnym wierszu po wywołaniu imapsync lub w pierwszym wierszu procedury obsługi sygnału. :-(
Jason Tan
6
jeśli rozwidla i wykształca dziecko, rodzic jest odpowiedzialny za zapisanie PID dziecka gdzieś. zwykłą praktyką jest zapisywanie go gdzieś jak /var/run/whatever.pid. Być może istnieje opcja wiersza polecenia, aby poprosić ją o zapisanie gdzieś PID; jeśli nie, brzmi to jak funkcja, o którą można zapytać autora lub wprowadzić go w życie.
Javier
1
Nacisk na tło . Jeśli żaden proces nie został umieszczony w tle (tj. Z dołączonym &), $!zmienna jest niezdefiniowana.
Trevor
1
Więcej podobnych rozwiązań jest sugerowanych w (odpowiedź na) Jak uzyskać pid dopiero rozpoczęty proces ; jako dodatek do tej odpowiedzi, komentarz tam mówi: och, a "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- dysfunkcja 24 listopada 10 o 14:28
imz - Ivan Zakharyaschev
10

W przeciwieństwie do pidof, pgrepmożna podać wiele opcji ograniczających, dla których procesów zwraca PID. Jednym, który może być szczególnie użyteczny, jest wybór na podstawie PPID z wykorzystaniem PID bieżącego procesu.

pgrep -P $$ imapsync

który wyśle ​​PID imapsync tylko wtedy, gdy są potomkami twojego skryptu.

Wstrzymano do odwołania.
źródło
0

Co powiesz na chwilowe umieszczenie imapsync w tle, uzyskanie PID, a następnie na pierwszym planie ... Coś takiego:

imapsync &
pid=$!
wait $pid
retVal=$?
znak
źródło