Введіть PID-файл вручну із сценарію Bash


10

Як я можу написати сценарій Bash, який запускає тривалу програму і зберігає ідентифікатор процесу програми в окремому файлі?

Я хочу щось подібне

#!/bin/bash
exec long_running_tool
echo `ps af |grep "long_running_tool" |awk '$5 == "long_running_tool" {print $1}'` > pid_file

Однак саме це зробить інструментps після завершення роботи.

Чи є спосіб отримати ідентифікатор процесу створеного процесу?


2
Ваш зразок коду не буде працювати, оскільки exec не роздрібнюється, тому процес оболонки замінюється long_running_toolпроцесом. Отже, exec ніколи не повертається і наступний рядок ніколи не досягається. Див help exec, execve(2).
Етьєна Дечамп

@ e-t172 дякую, що вказали. Я видаляю 'exec' потім.
DerMike

Відповіді:


12

Ви можете легко запустити процес у фоновому режимі за допомогою "&", а потім отримати PID фонового процесу, використовуючи "$!"

#!/bin/bash
long_running_tool &
echo $! > pid_file

Потім, за бажанням, зачекайте $! якщо ви хочете, щоб оболонка блокувалася, поки процес не завершить виконання.


1
ОНОВЛЕННЯ: при використанні fg я отримую 'fg: 21: job (null) не створюється під контролем роботи', і сценарій не блокується. Вибачте.
DerMike

"чекай $!" повинен мати подібний ефект до fg, який, я можу підтвердити, справді працює у сценарії. Я, мабуть, повинен був перевірити це перед публікацією. >.> моя погана.
Джеремі Стурдівант

9
#!/bin/bash
echo $$ > fooapp.pid
exec fooapp

Як було сказано раніше, exec замінює bash зазначену програму, зберігаючи PID.

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