С точки зрения операционной системы каждая запускающая программа является процессом. То, когда ядро будет сделано, инициализируя его, запустит один процесс, главным образом init
. Является ли это SYSV init, или systemd не важен для этого обсуждения, один процесс запускается. Любая программа запущена другим процессом. Это создает отношения между процессами, стартовым процессом (иначе "родитель") и запущенным процессом (иначе "ребенок"). Ядро знает об этих отношениях.
Когда процесс выходит в Linux/Unix, ядро отправляет во все его дочерние процессы сигнал номер 15 (SIGTERM). Это может быть поймано процессом, и процесс должен сделать то, что это должно сделать для выхода безопасным способом. Можно знать, также знают сигнал номер 9 (SIGKILL). Этот сигнал не может быть пойман процессом: ядро останавливает процесс отдельно.
Посмотрите это pstree
:
init─┬─acpid
├─atd
├─cron
├─dbus-daemon
├─dhclient
├─dhcpd
├─exim4
├─6*[getty]
├─lwresd───6*[{lwresd}]
├─named───6*[{named}]
├─nmbd
├─portmap
├─rpc.statd
├─rsyslogd───2*[{rsyslogd}]
├─smbd───2*[smbd]
├─sshd───sshd───bash───screen───screen───bash───pstree
└─udevd───2*[udevd]
Вы видите это pstree
дочерний процесс bash
, и bash
дочерний процесс screen
. Когда я выхожу из системы от машины, bash
после sshd
выходы и ядро отправляют сигнал 15 в дочерний процесс screen
. НО, screen
не реагирует на это. Так screen
новый родительский процесс является теперь процессом номер 1 (init
). Посмотрите в этом pstree
:
init─┬─acpid
├─atd
├─cron
├─dbus-daemon
├─dhclient
├─dhcpd
├─exim4
├─6*[getty]
├─lwresd───6*[{lwresd}]
├─named───6*[{named}]
├─nmbd
├─portmap
├─rpc.statd
├─rsyslogd───3*[{rsyslogd}]
├─screen───bash
├─smbd───2*[smbd]
├─sshd───sshd───bash───pstree
└─udevd───2*[udevd]
На самом деле это - то, что происходит, когда Вы отсоединяетесь screen
(ctrl+a - d). Так все подпроцессы screen
продолжайте бегать за разъединением или отсоединением от screen
. Когда Вы выполняете процесс без screen
или tmux
, это получит сигнал SIGTERM.
Также, если вы хотите посмотреть, к каким файлам применяется патч, вы можете запустить
Sample output с Mercurial:
Вы можете использовать параметр -i
вместо прямого перенаправления:
$ patch -i /path/to/file.patch