이 글은 주로 PHP의 두 가지 데몬 메소드를 소개합니다. 관심 있는 친구들이 참고하면 도움이 될 것입니다.
첫 번째 방법은 nohup과 &를 함께 사용하는 것입니다.
시작된 프로세스가 콘솔을 차지하지 않고 백그라운드에서 실행될 수 있도록 명령 뒤에 앰퍼샌드를 추가합니다. 여기서는 while 무한 루프를 사용하여 보여줍니다.
<?php while(true){ echo time().PHP_EOL; sleep(3); }
& 메소드를 사용하여 프로세스 시작
[root@localhost php]# php deadloop.php & [1] 3454 [root@localhost php]# ps aux | grep 3454 root 3454 0.0 0.8 284544 8452 pts/0 T 18:06 0:00 php deadloop.php root 3456 0.0 0.0 103316 896 pts/0 S+ 18:08 0:00 grep 3454 [1]+ Stopped php deadloop.php [root@localhost php]#
프로세스가 콘솔을 점유하지 않는 것을 볼 수 있습니다. 콘솔은 또한 다른 명령을 실행할 수도 있습니다. 이때 fg 명령을 사용하여 프로세스를 일반 모드로 복원할 수도 있습니다. 콘솔을 점령하는 것입니다.
[root@localhost php]# fg php deadloop.php 1470996682 1470996685 1470996688 1470996691
위는 & 명령에 대한 간략한 소개입니다
또 다른 명령 nohup을 살펴보겠습니다
명령 앞에 nohup을 추가하면 시작된 프로세스는 Linux 정지 신호( SIGHUP ), Linux에서 SIGHUP 신호는 어떤 상황에서 트리거됩니까? 다음 내용은 Baidu Encyclopedia에서 가져온 것입니다:
SIGHUP会在以下3种情况下被发送给相应的进程: 1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进 程) 2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程 3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或 SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。
1과 2를 결합하면 프로세스가 &(작업 모드로 시작되는지 여부에 관계없이) ), 터미널이 닫히면 SIGHUP 신호를 받게 되는데, SIGHUP 신호를 받으면 프로세스는 어떻게 될까요? Baidu Encyclopedia
系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该 信号时,进程就会退出。
에서도 가져온 문장을 참조하세요. 즉, 터미널 프로세스를 닫으면 SIGHUP을 받게 됩니다. 신호를 처리하는 기본 방법은 프로세스를 종료하는 것입니다. 물론 신호를 직접 캡처하고 처리하거나 무시할 수도 있습니다. 예를 들어 다음 코드에서는 이 루틴을 실행합니다. 명령줄을 클릭한 후 쉘 터미널 창을 직접 닫은 다음 터미널을 다시 열어 프로세스를 확인하세요. 아직 실행 중인가요?
<?php pcntl_signal(SIGHUP, function(){ //这地方处理信号的方式我们只是简单的写入一句日志到文件中 file_put_contents('logs.txt', 'pid : ' . posix_getpid() . ' receive SIGHUP 信号' . PHP_EOL); }); while(1) { sleep(10); pcntl_signal_dispatch(); }
deadloop.php가 계속 실행 중이고 상위 프로세스가 init 프로세스가 된 것을 볼 수 있습니다(왜냐하면 원래 상위 프로세스가 종료되어 init 프로세스에 의해 채택되었습니다. 작성된 파일의 내용도 볼 수 있습니다. 닫는 터미널 프로세스가 SIGHUP 신호를 수신했는지 확인하세요. 사실 그렇게 번거로울 필요는 없습니다. Linux에서 제공하는 nohup 명령만 사용하면 됩니다. 하지만 nohup을 사용하여 프로세스를 시작하면 프로세스가 수신된 SIGHUP 신호를 무시하고 종료되지 않습니다. 지금 당장 신호 처리 코드를 제거하세요. 그런 다음 nohup을 실행합니다.
[root@localhost php]# ps -ef | grep deadloop.php root 16112 1 0 17:20 ? 00:00:00 php deadloop.php root 16138 16115 0 17:24 pts/4 00:00:00 grep deadloop.php [root@localhost php]# cat logs.txt pid : 16112 receive SIGHUP 信号
그리고 nohup은 기본적으로 프로그램 출력을 현재 디렉터리의 nohup.out 파일로 리디렉션합니다. 쓰기 권한이 없으면 $homepath/nohup.out
[root@localhost php]# nohup php deadloop.php nohup: 忽略输入并把输出追加到"nohup.out"를 작성하세요.
[root@localhost php]# ls cmd.sh deadloop.php getPhoto.php nohup.out pics [root@localhost php]# tail -f nohup.out 1470999772 1470999775 1470999778 1470999781 1470999784 1470999787 1470999790 1470999793 1470999796 1470999799 1470999802
결론: 따라서 nohup과 & 메소드를 결합하면 시작된 프로세스는 콘솔을 차지하지 않으며 콘솔이 닫힌 후에는 콘솔에 의존하지 않습니다. , 프로세스는 1번 프로세스에 의해 채택되어 고아 프로세스가 됩니다. 이는 데몬 프로세스의 메커니즘과 매우 유사합니다.
[root@localhost ~]# ps -ef | grep 3554 root 3554 3497 0 19:09 pts/0 00:00:00 php deadloop.php root 3575 3557 0 19:10 pts/1 00:00:00 grep 3554 [root@localhost ~]# ps -ef | grep 3554 root 3554 1 0 19:09 ? 00:00:00 php deadloop.php root 3577 3557 0 19:10 pts/1 00:00:00 grep 3554 [root@localhost ~]#
위는 첫 번째 구현 방법에 대한 소개입니다.
두 번째 구현 방법은 데몬 프로세스의 규칙과 특성에 따라 코드를 통해 구현하는 것입니다. 데몬 프로세스의 가장 큰 특징은 사용자 단말과 세션이 분리되어 있다는 점입니다. 주요 위치에 댓글이 있습니다.
[root@localhost php]# nohup php deadloop.php >logs.txt 2>error.txt & [1] 3612 [root@localhost php]# ps -ef |grep 3612 root 3612 3557 0 19:18 pts/1 00:00:00 php deadloop.php root 3617 3557 0 19:19 pts/1 00:00:00 grep 3612 [root@localhost php]#
관련 권장 사항:
위 내용은 PHP에서 데몬 프로세스의 두 가지 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!