Различные pids при запуске процесса из скрипта bash - PullRequest
0 голосов
/ 17 мая 2018

Я пишу init.d скрипт и столкнулся с некоторой проблемой при сохранении разветвленного pid процесса.

Вот мой фрагмент скрипта инициализации:

sudo -u $USER nohup -- nice -n "0" java Test >> /dev/null 2>&1 < /dev/null &
NEWPID="$!"
echo $NEWPID

Но когда я запускаю этот скриптУ меня печатается следующий pid

$./scr.sh
4595

Но

$ps  | grep java
 4596 pts/23   00:00:01 java

Как видите, pid различны (4596 и 4595).Но если попытаться написать следующее:

java Test &
NEWPID="$!"
echo $NEWPID

Я получил правильный результат:

$./scr.sh
4653
$ps  | grep java
 4653 pts/23   00:00:03 java

Что не так с первым?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Попробуйте напечатать $! из той же оболочки, в которой вы запустили фоновый процесс:

NEWPID=$(sudo -u $USER bash -c "nohup -- nice -n 0 java Test >/dev/null 2>&1 </dev/null & echo $!")
echo $NEWPID
0 голосов
/ 17 мая 2018

В неэффективном мире было бы задействовано несколько процессов:

<the shell>   1234
    |
    |
  sudo        4595
    |
    |
  nohup       4596
    |
    |
  nice        4597
    |
    |
  java        4598

$! относится только к процессу, запускаемому в фоновом режиме самой оболочкой, то есть к процессу, который запускается sudo,java, процесс, который вас интересует, находится в процессе 4598. Вам нужно будет использовать ps (или некоторые другие инструменты), чтобы получить этот идентификатор процесса, так как оболочка его не узнает.


В мире real задействовано не так много процессов, поскольку не каждая работа в приведенной выше цепочке должна создавать новый процесс;некоторые из них могут просто использовать exec, чтобы заменить себя программой, которую они запускают.Я думаю , что sudo и nice оба делают это (nohup должен запустить новый процесс в другой группе процессов, чтобы он сделал то, что он делает).Таким образом, цепочка больше похожа на

<the shell>      1234
    |
    |
 sudo/nohup      4595
    |
    |
 nice/java       4596

Но конечный результат тот же;оболочка не может получить идентификатор процесса, в котором, в конечном счете, запускается java.

...