Вы уже получаете правильную информацию о дочернем процессе. Только в вашем случае ps
не знает или не хочет показывать правильное COMMAND
имя для вашего подпроцесса, который вы запускаете в фоновом режиме - что, вероятно, смутило вас.
Похоже, это случай со связанными командами (.. && ...
, таким образом, он не имеет ничего общего с exit 1
, может быть также echo 5
et c.), где лидер группы процессов имя вместо этого отображается cmd
имя.
со страницы руководства пользователя ( ps )
`cmd | COMMAND`: simple name of executable
# Process state codes
`S`: interruptible sleep (waiting for an event to complete)
`+`: is in the foreground process group
См. S+
в выводе ps | grep
.
Итак, вы можете немного адаптировать свой сценарий, чтобы подтвердить, что вы действительно захватываете (d) правильную информацию о дочернем процессе, например так:
cat <<"END"> z
#! /bin/bash
sleep 20 && exit 1 &
ret=$!
echo $ret
jobs -l
# display parent and child process info
# -j Jobs format
ps -j $$ $ret
END
Вывод echo $ret
:
30274
Вывод jobs -l
:
[1]+ 30274 Running sleep 20 && exit 1 &
Вывод ps -j $$ $ret
:
PID PGID SID TTY STAT TIME COMMAND
30273 30273 21804 pts/0 S+ 0:00 /bin/bash ./z
30274 30273 21804 pts/0 S+ 0:00 /bin/bash ./z
Обратите внимание, что родитель и ребенок имеют одинаковые PGID
, тогда как pid 30274 дочернего процесса, отображаемый как jobs -l
и ps ...
, совпадает.
Далее, если вы измените sleep 20 && exit 1 &
на bash -c 'sleep 20 && exit 1' &
, вы получите правильное имя команды для ребенка на этот раз, как показано ниже (ср. порядок вывода выше):
30384
[1]+ 30384 Running bash -c 'sleep 20 && exit 1' &
PID PGID SID TTY STAT TIME COMMAND
30383 30383 21804 pts/0 S+ 0:00 /bin/bash ./z
30384 30383 21804 pts/0 S+ 0:00 bash -c sleep 20 && exit 1
Последнее, но не менее важное: в исходной версии вместо ps $ret | grep $ret
вы также можете попробовать
pstree -s $ret
с pstree man page
-s: Показать родительские процессы указанного процесса.
, который предоставит вам вывод, аналогичный приведенному ниже, который также подтвердит, что вы получите правильную информацию о процессе для sleep 20 && exit 1 &
:
systemd───systemd───gnome-terminal-───bash───bash───sleep