Напишите файл 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 after .

Есть ли способ получить идентификатор процесса созданного процесса?

DerMike
источник
2
Ваш пример кода не будет работать, потому что exec не работает, поэтому процесс оболочки заменяется long_running_toolпроцессом. Следовательно, exec никогда не возвращается, и следующая строка никогда не достигается. См help exec, execve(2).
Этьен Дечам
@ e-t172 спасибо за указание. Я удаляю 'exec' тогда.
DerMike
2
Пожалуйста, смотрите Управление процессами .
Приостановлено до дальнейшего уведомления.

Ответы:

12

Вы можете легко запустить процесс в фоновом режиме с помощью «&», а затем получить PID фонового процесса с помощью «$!»

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

Тогда, по желанию, подождите $! если вы хотите, чтобы оболочка блокировалась до тех пор, пока процесс не завершит выполнение.

Джереми Стурдивант
источник
1
ОБНОВЛЕНИЕ: когда я использую fg, я получаю «fg: 21: задание (пустое) не создано под контролем задания», и скрипт не блокируется. Сожалею.
DerMike
"подождите $!" должен иметь эффект, аналогичный fg, который, я могу подтвердить, действительно работает в скрипте. Я должен был проверить это перед публикацией. >.> мой плохой.
Джереми Стурдивант
9
#!/bin/bash
echo $$ > fooapp.pid
exec fooapp

Как упоминалось ранее, exec заменяется bash указанной программой, сохраняя PID.

user1686
источник