프로세스를 자동으로 데몬화하고 백그라운드에서 실행하는 프로그램이 있습니다.
이 프로그램을 강제로 포그라운드에서 실행시키는 방법이 있나요? 이것을 스크립트에 넣고 반환 코드를 캡처하여 정상적으로 종료되는지 확인하고 싶습니다.
답변1
프로세스가 데몬화되면 자신을 분기하고(적어도 한 번) 상위 프로세스가 즉시 반환되며 하위 프로세스가 작업을 완료합니다.
그 아이가 죽으면 더 이상 부모가 없습니다. 또는 오히려 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
답변2
이것이 단지 가끔 디버깅을 위한 것이라고 가정하고 종료 코드를 캡처하려는 경우 최종 데몬의 프로세스 ID를 알고 있다면 여기에 추가하고 strace -p
종료될 때까지 이와 같이 추적할 수 있습니다.
예를 들어 종료하기 전에 pid를 가져올 시간이 없다면 아래 명령을 실행하여 strace -f
하위 프로세스를 추적할 수 있습니다. 간단한 데몬 데모는 없지만 다음 예제를 통해 어떻게 작동하는지 확인할 수 있습니다.
$ strace -f -e exit bash -c 'nohup bash -c "sleep 10; exit 2" &'
strace: Process 9688 attached
[pid 9687] +++ exited with 0 +++
nohup: appending output to 'nohup.out'
strace: Process 9689 attached
[pid 9689] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=9689, si_uid=127, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 2 +++
여기서는 내부 "daemon" bash 명령에서 종료 코드 2를 성공적으로 수집했음을 확인할 수 있습니다.
아니면 당신이 가지고 있다면체계, 별도의 cgroup에서 명령을 실행해 볼 수 있습니다.
$ systemd-run --user --service-type=forking bash -c '(sleep 99;exit 2)& exit 0'
Running as unit run-8772.service.
폴링 외에 생성된 종료 코드를 수집하는 방법을 모르겠습니다. 너무 빨리 완료되면 데몬이 여전히 활성 상태입니다.
$ systemctl --user status run-8772
...
Active: active (running) since Wed 2017-03-29 18:56:43 CEST; 14s ago
CGroup: /user.slice/user-1000.slice/[email protected]/run-8772.service
|-8774 /usr/bin/bash -c (sleep 99;exit 2)& exit 0
`-8775 sleep 99
적절한 지연 후에 프로세스가 종료되고 원하는 종료 코드에 액세스할 수 있습니다.
$ systemctl --user status run-8772
Active: failed (Result: exit-code) since Wed 2017-03-29 18:58:22 CEST; 3s ago
Main PID: 8774 (code=exited, status=2)