Когда процесс демонизируется, он разветвляется (как минимум один раз ), родительский процесс возвращается немедленно, а дочерний процесс выполняет эту работу.
Когда этот ребенок умирает, у него больше нет родителя. Вернее, он был принятinit
(процессом id 1 ). init
сможет получить статус выхода.
В Linux и начиная с ядра 3.4 вы можете указать, какой процесс будет принимать осиротевшие процессы (для своих потомков и потомков ), используяPR_SET_CHILD_SUBREAPER
prctl()
.
Итак, как и в этом очень похожем вопросе и ответе , если в Linux 3.4+ вы можете запустить свой демон под оболочкой, которая объявляет себя дочерним поджнецом , и он сообщает о статусе выхода. его потомков-сирот:
Здесь используется perl
и жестко заданное значениеPR_SET_CHILD_SUBREAPER
prctl()
:
perl -MPOSIX -le '
require "syscall.ph";
syscall(&SYS_prctl,36,1) >= 0 or die "cannot set subreaper: $!";
if (!fork) {
exec @ARGV;
exit(127);
}
# now reporting on all children and grand-children:
while (($pid = wait) > 0) {
print "$pid: ". WEXITSTATUS($?)
}' your-daemon here
Поскольку ваш системный вызов connect()
возвращаетEACCES
(errno==13 ), на основании connect(2)
есть две возможности:
Для первого потребуются странные и неправдоподобные записи в /etc/hosts
или еще более странная настройка DNS, поэтому я ставлю деньги на второе (правило локального брандмауэра ).
Так как ошибка
fatal: unable to access 'https://github.com/repository-name': Couldn't connect to server
Теперь, после этого, скопируйте его и используйте в качестве пароля в терминале как
Username for 'https://github.com': your_username
Password for 'https://your_username@github.com': personal access tokens