Вкратце
С &
и disown
вы не меняете PID [ 1 ] процесса.
Если вы не видите его в ps -p <YOURPID>
, он больше не работает.
Вы можете перепроверить это с дополнительным echo $?
[ 2 ] после команды ps
(или kill
), проверка завершения программы с кодом выхода, отличным от 0
(обычно 1
).
Понимание ваших команд.
Фон: когда вы запускаете команду с финалом &
отправляете ее в фоновом режиме.
Это означает, что:
- Он присутствует в списке заданий вашей оболочки (в вашем примере это число
[1]
и вы можете ссылаться на него как %1
; (попробуйте команду jobs
).
- Вы можете перенести его на передний план и на задний план с помощью
fg
и bg
.
Он (все еще) "принадлежит" оболочке (связанной с родительской): если оболочка получает сигнал SIGHUP
, она также отправит сигнал SIGHUP
процессу.
$ sleep 1h &
[1] 10795
$ jobs
[1]+ running sleep 1h &
$ ps -l -p 10795
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 10795 8380 0 80 0 - 3107 hrtime pts/57 00:00:00 sleep
Disown: с помощью команды disown
вы удаляете задание из списка заданий оболочки, но не меняете его PID.
$ disown
$ jobs
# <---- No jobs
$ ps -l -p 10795
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 10795 8380 0 80 0 - 3107 hrtime pts/57 00:00:00
Обратите внимание на тот же PPID (оболочка все еще существует).
Теперь мы убиваем снаряд.
$ kill 8380 # Here we kill the shell
$ ps -l -p 10795
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 10795 5339 0 80 0 - 3107 hrtime pts/57 00:00:00 sleep
Есть еще один PPID
, 5339
, который при другом вызове ps
, ps -p 5339
, вы обнаружите, что он является экземпляром init
:
$ ps -p 5339
PID TTY TIME CMD
5339 ? 00:02:20 init
pstree
: более быстрый путь.
Вы можете увидеть с pstree
быстрее.
Перед тем как disown
и убить команды bash :
$ pstree -s -p 10795
init(1)───lightdm(1199)───lightdm(5259)───bash(8380)───sleep(10795)
После disown
и убийства
$ pstree -s -p 10795
init(1)───lightdm(1199)───lightdm(5259)───init(5339)───sleep(10795)
Примечание: конечно, все PID в вашем случае будут разными ...