it-roy-ru.com

Как запустить Nohup и записать его pid-файл в одном выражении bash

Я хочу запустить свой скрипт в фоновом режиме, а затем написать его файл 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 

Любые решения для этого, учитывая, что я хочу однострочное утверждение для достижения этого?

41
amitkarmakar

У вас уже есть один амперсанд после перенаправления, который помещает ваш скрипт в фоновый режим. Поэтому вам нужно только набрать нужную команду после этого амперсанда, без префикса:

Nohup ./myprogram.sh > /dev/null 2>&1 & echo $! > run.pid
85
Grigor Yosifov

Это должно работать:

Nohup ./myprogram.sh > /dev/null 2>&1 &
echo $! > run.pid
15
anubhava

Ответ Григора верен, но не завершен . Получение 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, дочерний процесс еще не будет существовать.

1
Mor Blau