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?


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.


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 .


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.


0

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

imapsync &
pid=$!
wait $pid
retVal=$?
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.