메인 프로세스에서 생성된 프로세스의 종료 코드를 가져옵니다.

메인 프로세스에서 생성된 프로세스의 종료 코드를 가져옵니다.

run-jobs하위 프로세스로 다른 작업을 시작하는 기본 프로세스(아래)가 있습니다 . 기본 프로세스가 실패하면(예: 데이터베이스 실패) 0이 아닌 상태 코드로 종료됩니다. 이는 문제가 없으며 $?변수( ) 를 보면 확인할 수 있습니다 echo $?.

그러나 주 작업이 실패할 경우를 대비해 하위 프로세스의 종료 코드도 확인하고 싶습니다. process_1기본 프로세스가 사라진 후 다음 종료 코드를 확인하는 편리한 방법이 있습니까 ?process_2

이것은 다음의 단순화된 출력입니다 ps auxf.

vagrant 5167 | \_ php app/console run-jobs vagrant 5461 | \_ php process_1 vagrant 5517 | \_ php process_2

답변1

부모가 ID 1()인 프로세스에 대해 종료된 경우 프로세스는 종료 상태를 부모에게 보고 init하지만 최신 버전의 Linux(3.4 이상)에서는 다른 조상을 다음과 같이 지정할 수 있습니다.어린이용 수확기이 역할의 경우( 사용 prctl(PR_SET_CHILD_SUBREAPER))

효과적으로 프로세스가 종료되면 상위 프로세스가 init종료 상태(with waitpid()또는 other)를 검색할 때까지 좀비 프로세스가 됩니다.

당신의 경우, 당신은 아이들이 죽음 이후 (?) 죽음을 맞이하고 있다고 말하고 있습니다 run-jobs. 이는 init하위 리퍼로 지정된 프로세스에 종료 상태를 보고한다는 의미입니다.

이를 기록하지 않고 init(일반적으로 기록하지 않음) 감사 또는 프로세스 계정을 사용하지 않으면 종료 상태가 손실됩니다.

최신 버전의 Linux에서는 자체 하위 수확기를 만들어 이러한 고아 프로세스의 pid 및 종료 상태를 가져올 수 있습니다. 좋다 perl:

$ perl -MPOSIX -le '
  require "syscall.ph";
  syscall(&SYS_prctl,36,1) >= 0 or die "cannot set subreaper: $!";

  # example running 1 child and 2 grand children:
  if (!fork) {
    # There, you would run:
    # exec("php", "run-jobs");
    if (!fork) {exec "sleep 1; exit 12"};
    if (!fork) {exec "sleep 2; exit 123"};
    exit(88)
  }
  # now reporting on all children and grand-children:
  while (($pid = wait) > 0) {
   print "$pid: " . WEXITSTATUS($?)
  }'
22425: 88
22426: 12
22427: 123

죽은 프로세스(예: 명령줄, 사용자, ppid...)에 대한 정보를 검색하려면 해당 프로세스가 아직 좀비 상태에 있는 동안, 즉 해당 프로세스 wait()에 대해 작업을 수행하기 전에 이 작업을 수행해야 합니다.

이렇게 하려면 waitid()옵션과 함께 API를 사용해야 합니다(그런 다음 WNOWAIT명령에서 정보를 가져와야 합니다). 인터페이스가 없는 것 같아서 ./procpsperlC

관련 정보