Как запустить nohup и записать его файл pid в одном выражении bash
Я хочу запустить мой script в фоновом режиме, а затем записать его файл pid. Я использую nohup для этого.
Вот что я придумал,
nohup ./myprogram.sh > /dev/null 2>&1 & && echo $! > run.pid
Но это дает синтаксическую ошибку.
Ниже приведена синтаксическая ошибка, но проблема - echo $! не записывает правильный pid, поскольку nohup запускается в подклассу
(nohup ./myprogram.sh > /dev/null 2>&1 &) && echo $! > run.pid
Любые решения для этого, учитывая, что для получения этого требуется один оператор строки?
Ответы
Ответ 1
У вас уже есть один амперсанд после перенаправления, который помещает ваш script в фоновом режиме. Поэтому вам нужно только ввести нужную команду после этого амперсанда, а не префикс чего-либо еще:
nohup ./myprogram.sh > /dev/null 2>&1 & echo $! > run.pid
Ответ 2
Это должно работать:
nohup ./myprogram.sh > /dev/null 2>&1 &
echo $! > run.pid
Ответ 3
Григор ответ правильный, но не полный. Получение pid напрямую из команды nohup - это не то же самое, что получение pid вашего собственного процесса.
работает ps -ef
:
root 31885 27974 0 12:36 pts/2 00:00:00 sudo nohup ./myprogram.sh
root 31886 31885 25 12:36 pts/2 00:01:39 /path/to/myprogram.sh
Чтобы получить pid своего собственного процесса, вы можете использовать:
nohup ./myprogram.sh > /dev/null 2>&1 & echo $! > run.pid
# allow for a moment to pass
cat run.pid | pgrep -P $!
Обратите внимание, что если вы попытаетесь запустить вторую команду сразу после nohup, дочерний процесс еще не будет существовать.