백그라운드에서 작업을 실행하고 종료 시점을 확인하세요.

백그라운드에서 작업을 실행하고 종료 시점을 확인하세요.

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 &

관련 정보