my_script
백그라운드에서 Unix 쉘 스크립트(unix)를 실행하고 웹 인터페이스에서 이를 모니터링해야 합니다 .
다음과 같이 PHP에서 실제 스크립트를 시작합니다.
$command = 'my_script';
$pid= exec("nohup {$command} > {$logFile} & echo $!");
그런 다음 $pid
내 프로세스의 pid를 포함하여 해당 프로세스가 아직 실행 중인지 확인할 수 있습니다 file_exists("/proc/{$pid}")
.
그러나 문제는 프로세스가 종료되는 시기와 종료 시 실행된 시간을 어떻게 알 수 있는가입니다.
또한 프로세스가 언제 시작되는지 알 수 있는 좋은 방법이 있습니까? 호출 전후에 PHP로 타임스탬프를 기록할 수 있지만 exec
다소 부정확할 수 있습니다.
편집하다:
명확히 하자면, PHP 스크립트는 쉘 스크립트가 완료될 때까지 기다릴 수 없습니다. 쉘 스크립트는 백그라운드에서 실행되어야 합니다. 아마도 my_script
세 가지 명령(로그 시작 시간, 실행 시간, 로그 완료 시간)을 셸에 래핑하여 sh -c
에 전달할 수도 있지만 nohup
, 시작 시간만 기록하는 것으로 끝나지 않도록 전체 시퀀스가 원자적이기를 원합니다( 모두) 오류입니다.
답변1
중간 쉘을 제거하고 직계 자식으로 시작해야 합니다. 아마도 이와 유사한 것을 사용합니다 proc_open
(저는 PHP 전문가가 아닙니다). 그런 다음 SIGCHLD
자식이 종료되면 이 표시됩니다. 신호 처리기를 설치하고( pcntl_signal
아마도) 그 안에 자녀의 PID를 비차단 방식으로 WNOHANG
대기( )할 수 있으며, 대기가 성공하면 시간을 기록하고 신호 처리기를 제거합니다.pcntl_waitpid
file_exists("/proc/{$pid}")
wait
통화를 제어하지 않으면 ( pid
자녀가 아닌 경우) PID가 재활용되므로 신뢰할 수 없습니다.
답변2
웹 프런트엔드를 사용하고 있으므로 at/batch가 필요한 것 같습니다. 결과는 사용자에게 이메일로 전송되거나 사용자가 쿼리할 수 있습니다(클라이언트 측 JavaScript 또는 간단한 사용자 기반 검사 사용).
답변3
스크립트에서 종료 조건을 기록하는 가장 쉬운 방법은 기록하도록 하는 것입니다.
#!/bin/sh
trap 'date +"
My name is $0. My PID is $$.
My start time was '"$(date)."'
The time is now %X on %x.
My exit code is $?. Goodbye.
" >/tell/somebody' EXIT
: now do some stuff
EXIT 트랩은 모든 종료 시나리오에서 작동해야 하지만신호 살해.
문제의 스크립트를 편집할 수 없는 경우 지침을 제어할 수 있는 셸에 스크립트를 래핑하면 됩니다. 예를 들어 다음과 sh -c
같습니다.
trap=': the trap' sh -c '
trap "$trap" 0;. "$0"' \
./script/i/cant/edit \
positional params &
w/를 사용하여 유사한 작업을 수행할 수 있지만 w/ sh -s
의 값은 $0
컨트롤만큼 간단하지 않을 수 있습니다. 일부 쉘의 경우 exec
이를 변경하려면 새로운 파일/대체 쉘이 필요합니다.(때때로 프로세스 이름의 모든 경로 구성 요소를 변경/제거하기 위해 PATH=.
심볼릭 링크를 사용합니다)exec
.
echo 'trap "$trap" EXIT' |
cat - ./script/i/cant/edit |
trap=': the trap' sh -s -- \
positional params go here &