node.js - PHP 스크립트를 데몬으로 계속 실행하려면 어떻게 해야 합니까?

WBOY
풀어 주다: 2016-08-23 09:17:51
원래의
1575명이 탐색했습니다.

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 셸 실행

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿