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

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


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: задание (пустое) не создано под контролем задания», и скрипт не блокируется. Сожалею.
DerMike

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.