Ich habe einen Server mit Swoole geschrieben. Ich habe vor, ihn als Daemon aufzuhängen und ihn kontinuierlich auszuführen. Dadurch kann das Skript so schnell wie möglich neu gestartet werden, nachdem es aufgrund eines Fehlers beendet wurde Das?
Ich habe einen Server mit Swoole geschrieben. Ich habe vor, ihn als Daemon aufzuhängen und ihn kontinuierlich auszuführen. Dadurch kann das Skript so schnell wie möglich neu gestartet werden, nachdem es aufgrund eines Fehlers beendet wurde Das?
Der Linux-Befehl nohup führt dieses PHP-Skript aus und schreibt dann eine Shell, um den Ausführungsstatus dieses Skripts zu überwachen. Wenn das Skript abstürzt, starten Sie es neu
Schreiben Sie das Skript einfach als Schleife, z. B. while(1), damit es ewig ausgeführt werden kann.
In diesem Skript-Header wird beurteilt, ob dieses Skript bereits einen Prozess hat. Beenden Sie es direkt und führen Sie es aus, wenn kein Prozess vorhanden ist.
Schreiben Sie eine weitere geplante Linux-Aufgabe, z. B. die Ausführung dieses PHP-Skripts jede Minute.
Nachdem das Skript einmal ausgeführt wurde, wird es jede Minute ausgeführt. Wenn das Skript aktiv ist, wird es sofort beendet.
Schreiben Sie das PHP-Skript. Es wird empfohlen, die Speichernutzung regelmäßig zu überprüfen und die Kernlogik nicht zu schreiben. Das hängt mit dem Geschäft zusammen.
<code>if(memory_get_usage()>100*1024*1024){ exit(0);//大于100M内存退出程序,防止内存泄漏被系统杀死导致任务终端 }</code>
Angenommen, der Pfad der PHP-Datei ist /root/run.php
Öffnen Sie das Terminal
<code>setsid php /root/run.php > /dev/null &</code>
Bearbeiten Sie das Prozessüberwachungsskript, um den Prozess automatisch neu zu starten, wenn er nicht existiert /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>
Geplante Aufgaben hinzufügen (jede Minute erkannt)
<code>crontab -e * * * * * /root/monitor.sh > /dev/null &</code>
Handgefertigt
Verwenden Sie ein einfaches und zuverlässiges Shell-Skript, um einen PHP-Dienst zu schützen, der plötzlich beendet werden könnte
Fügen Sie den Boot-Befehl zu/etc/rc.local hinzu:
<code>nohup /path/to/swoole.sh >>/path/to/swoole.sh.log 2>&1 &</code>
swoole.sh-Inhalt ist wie folgt:
<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>
Unter ihnen:
<code>nohup 表示忽略SIGHUP信号(编号1),比如退出终端时发送的SIGHUP信号(kill -SIGHUP PID)会被忽略掉. >>${PREFIX}/swoole.log 表示把标准输出重定向(>>表示追加,>表示覆盖)到文件swoole.log 2>&1 表示将标准错误(2:stderr)重定向到标准输出(1:stdout). 结尾加上&表示将命令放入后台运行. $! 表示前面运行在后台的PHP进程PID.</code>
Das heißt, swoole.sh prüft alle 1 Sekunde, ob das Verzeichnis /proc/PID existiert. Wenn es nicht existiert, starten Sie den Dienst neu.
swoole.sh.log zeichnet die Zeit auf, zu der der Dienst neu gestartet wird.
swoole.log zeichnet die Ausgabe des Dienstes selbst auf.
Verwenden Sie beispielsweise Shell, um vmstat zu schützen:
<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>
Dieses vmstat.sh-Skript kann auch in PHP implementiert werden:
<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. Es muss jede Minute eine Crontab vorhanden sein (ps -ef | grep..) Wenn nicht, erstellen und ausführen Sie einen Prozess, der ausgeführt wurde endlos.
3. Das Crontab-Skript kann den Status Ihres laufenden Prozesses erkennen, es wartet ständig, keine Antwort oder andere Probleme, Sie müssen es selbst beenden und neu starten