Swoole을 사용하여 서버를 작성했는데 서버에 데몬으로 걸어놓고 계속 실행할 예정입니다. 이렇게 하면 오류로 인해 예기치 않게 종료된 후 최대한 빨리 스크립트를 다시 시작할 수 있습니다. 이것?
Swoole을 사용하여 서버를 작성했는데 서버에 데몬으로 걸어놓고 계속 실행할 예정입니다. 이렇게 하면 오류로 인해 예기치 않게 종료된 후 최대한 빨리 스크립트를 다시 시작할 수 있습니다. 이것?
linux nohup 명령은 이 PHP 스크립트를 실행한 다음 이 스크립트의 실행 상태를 모니터링하기 위해 셸을 작성합니다. 스크립트가 종료되면 다시 시작하세요.
영원히 실행될 수 있도록 스크립트를 while(1)과 같은 루프로 작성하기만 하면 됩니다.
이 스크립트 헤더에서 이 판단은 이 스크립트에 대한 프로세스가 이미 있으면 바로 종료하고 프로세스가 없으면 실행합니다.
이 PHP 스크립트를 1분마다 실행하는 것과 같은 또 다른 Linix 예약 작업을 작성합니다.
스크립트를 한 번 실행한 후에도 예약된 작업은 1분마다 스크립트를 실행합니다. 스크립트가 종료되면 바로 종료됩니다.
php 스크립트를 작성합니다. 정기적으로 메모리 사용량을 확인하고 핵심 로직을 작성하지 않는 것이 좋습니다. 이는 사업과 관련이 있습니다.
<code>if(memory_get_usage()>100*1024*1024){ exit(0);//大于100M内存退出程序,防止内存泄漏被系统杀死导致任务终端 }</code>
php 파일의 경로가 /root/run.php
터미널을 엽니다
<code>setsid php /root/run.php > /dev/null &</code>
프로세스가 존재하지 않을 때 자동으로 다시 시작하도록 프로세스 모니터링 스크립트를 편집하세요. /root/monitor.sh
<code>#!/bin/bash alive=`ps aux|grep root\/run|grep -v grep|wc -l` if [ $alive -eq 0] then php /root/run.php > /dev/null & fi</code>
예약된 작업 추가(1분마다 감지)
<code>crontab -e * * * * * /root/monitor.sh > /dev/null &</code>
핸드메이드
간단하고 안정적인 쉘 스크립트를 사용하여 갑자기 종료될 수 있는 PHP 서비스를 보호하세요
/etc/rc.local에 부팅 명령을 추가합니다:
<code>nohup /path/to/swoole.sh >>/path/to/swoole.sh.log 2>&1 &</code>
swoole.sh 내용은 다음과 같습니다.
<code>#!/bin/sh PREFIX=/home/eechen INTERVAL=1 nohup php ${PREFIX}/swoole.php >>${PREFIX}/swoole.log 2>&1 & echo $! > ${PREFIX}/swoole.pid while [ 1 ]; do if [ ! -d /proc/`cat ${PREFIX}/swoole.pid` ]; then nohup php ${PREFIX}/swoole.php >>${PREFIX}/swoole.log 2>&1 & echo $! > ${PREFIX}/swoole.pid echo 'NEW_PID:'`cat ${PREFIX}/swoole.pid && date '+%Y-%m-%d %H:%M:%S'` fi sleep ${INTERVAL} done</code>
그 중:
<code>nohup 表示忽略SIGHUP信号(编号1),比如退出终端时发送的SIGHUP信号(kill -SIGHUP PID)会被忽略掉. >>${PREFIX}/swoole.log 表示把标准输出重定向(>>表示追加,>表示覆盖)到文件swoole.log 2>&1 表示将标准错误(2:stderr)重定向到标准输出(1:stdout). 结尾加上&表示将命令放入后台运行. $! 表示前面运行在后台的PHP进程PID.</code>
즉, swoole.sh는 /proc/PID 디렉터리가 존재하는지 1초마다 확인합니다. 존재하지 않으면 서비스를 다시 시작합니다.
swoole.sh.log는 서비스가 다시 시작되는 시간을 기록합니다.
swoole.log는 서비스 자체의 출력을 기록합니다.
예를 들어 Shell을 사용하여 vmstat를 보호합니다.
<code>vmstat.sh #!/bin/sh PREFIX=/home/eechen INTERVAL=1 nohup vmstat 1 >>${PREFIX}/vmstat.log 2>&1 & echo $! > ${PREFIX}/vmstat.pid while [ 1 ]; do if [ ! -d /proc/`cat ${PREFIX}/vmstat.pid` ]; then nohup vmstat 1 >>${PREFIX}/vmstat.log 2>&1 & echo $! > ${PREFIX}/vmstat.pid echo 'NEW_PID:'`cat ${PREFIX}/vmstat.pid && date '+%Y-%m-%d %H:%M:%S'` fi sleep ${INTERVAL} done #运行 nohup /home/eechen/vmstat.sh >>/home/eechen/vmstat.sh.log 2>&1 & #杀死,可以看到vmstat被重启 kill `cat /home/eechen/vmstat.pid`</code>
이 vmstat.sh 스크립트는 PHP에서도 구현할 수 있습니다.
<code>nohup php /home/eechen/vmstat.php >>/home/eechen/vmstat.php.log 2>&1 & <?php $prefix = '/home/eechen'; $interval = 1; shell_exec("nohup vmstat 1 >>$prefix/vmstat.log 2>&1 & echo $! > $prefix/vmstat.pid"); while ( 1 ) { if ( !file_exists('/proc/'.trim(file_get_contents("$prefix/vmstat.pid"))) ) { shell_exec("nohup vmstat 1 >>$prefix/vmstat.log 2>&1 & echo $! > $prefix/vmstat.pid"); echo 'NEW_PID:'.trim(file_get_contents("$prefix/vmstat.pid")).' '.date('Y-m-d H:i:s'); } sleep($interval); }</code>
1. crontab이 있어야 합니다. 1분마다 존재하는지 확인합니다(ps -ef | grep..). 종료되면 실행 중이었던 프로세스를 생성하고 실행합니다.
3. crontab 스크립트는 실행 중인 프로세스의 상태를 감지할 수 있습니다. 문제가 있거나 계속 대기하거나 응답이 없거나 다른 문제가 있는 경우 직접 종료하고 다시 시작해야 합니다.
Linux 셸 실행