Подтвердить что ты не робот

Как запустить 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 

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

4b9b3361

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