ПІД процесу башти дитини (imapsync) - як це отримати?


15

Хто-небудь може сказати мені, як отримати PID команди, виконаної в bash.

Наприклад, у мене є сценарій bash, який запускає imapsync.

Коли сценарій вбито, процес Imapsync не завжди вбивається, тому я хотів би мати можливість ідентифікувати PID Imapsync програмно з мого сценарію, щоб я міг сам вбити процес Imapsync в обробці сигналу.

Тож як я можу програмно отримати PID дочірнього процесу з батьківського скрипта bash?


1
Як щодо "pidof imapsync"? Що з цим не так?
пітр

2
Про підофа я не знав. Однак тепер, коли я це роблю, це не корисно для цього сценарію, наскільки я можу сказати, тому що pidof, здається, повертає всі процеси даної команди в системі - навіть ті, що належать іншим скриптам / користувачам. Крім того, Imapsync - це насправді сценарій perl, тому я б робив pidof perl, який знову може повернути процеси, які не є Imapsync і можуть належати іншим користувачам.
Джейсон Тан

Хав'єр правильний. Ця сторінка надасть додаткову інформацію про ProcessManagement .
занурення

Відповіді:


4

Imapsync має можливість встановити, де пишеться її pid:

--pidfile: файл, де записаний pid imapsync.


FYI це насправді не відповідає на моє запитання в загальному сенсі, але я виявив - аргументований файл і з деякими фальсифікаціями навколо цього був досить хорошим ..
Jason Tan

@JasonTan навіщо вчити людину ловити рибу, коли ти можеш дати йому смачно заздалегідь приготовлене філе, щоб він повернувся та помахував тебе ще більше, завтра, так? вибачте за стару посаду, але навіщо приймати цю відповідь через "Хав'єр"?
несинхронізований

46
any_command args &
my_child_PID=$!

IOW, так само як і $$ваш PID, $!має PID останньою виконаною фоновою командою .


Дякую, але Imapsync не фоновий і $! не встановлюється, якщо я повторюю його в наступному рядку після виклику Imapsync або першого рядка обробника сигналу. :-(
Джейсон Тан

6
якщо це роздвоєння та підкріплення дитини, відповідальність за те, щоб батьки зберегли десь ПДД, відповідальність батька. звичайна практика - це збереження його десь як /var/run/whatever.pid. Можливо, є варіант командного рядка, щоб попросити його зберегти PID десь; якщо ні, це звучить як особливість запитати автора чи реалізовувати себе.
Хав'єр

1
Акцент на тлі . Якщо жоден процес не був розміщений у фоновому режимі (тобто із додаванням &), то $!змінна не визначена.
Тревор

1
Більше подібних рішень пропонується в (відповідь на) Як зрозуміти щойно розпочатий процес ; як додаток до цієї відповіді, коментар там говорить: о, і "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24 листопада '10 о 14:28
imz - Іван Захарящев

10

На відміну від цього pidof, pgrepможна надати різноманітні варіанти обмеження, для яких процесів він повертає PID. Можливо, особливо корисним є вибір на основі PPID, використовуючи PID поточного процесу.

pgrep -P $$ imapsync

який видасть PID-файли imapsync лише у тому випадку, якщо вони є дітьми вашого сценарію.


0

Як щодо того, щоб миттєво поставити Imapsync на задній план, отримати ПІД та випереджати його ... Щось таке:

imapsync &
pid=$!
wait $pid
retVal=$?
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.