나는 다음을 사용하여 PHP 파일을 실행하고 있습니다.
nohup php server.php &
특정 포트를 수신하고 입력에 따라 작업을 수행합니다.
문제는 때때로 스크립트가 중지된다는 것입니다. 내 서버가 계속 포트를 수신하고 하위 프로세스를 생성하기 때문에 cron 작업을 사용하여 이 문제를 해결할 수 없습니다.
server.php
실행 중인지 확인하고 그렇지 않은 경우 시작하는 방법이 있습니까 ?
답변1
check process 를 사용할 수 있지만 ps
한 가지 단점은 실행 중인 프로세스의 인스턴스가 여러 개 있거나 스크립트가 중단된 경우 이 방법이 결정적이지 않을 수 있다는 것입니다.
나는 서버가 포트에서 수신 대기 중인지 실제로 확인하는 것을 선호합니다. 이를 수행하는 몇 가지 방법은 다음과 같습니다. 예를 들어 서버가 포트 2000에서 수신 대기하는 경우 다음을 고려하세요.
사용lsof
lsof -i :2000; echo $?;
lsof
열린 파일 설명자를 검사하고 있으며 프로그램이 이 포트에서 수신 중인지 또는 적극적으로 통신 중인지 표시해야 합니다. 0
서버가 포트 2000에서 연결을 수락하면 a가 에코되고, 1
그렇지 않으면 a가 에코됩니다.
사용nc
nc -z -w1 192.168.1.12 2000 &> /dev/null; echo $?;
이것은 소켓 서버를 확인하는 데 내가 선호하는 방법입니다. 여기서는 제로 I/O 모드 플래그를 nc
사용하여 포트를 빠르게 스캔합니다. -z
여기에서 IP 주소와 올바른 포트를 사용할 수 있습니다. 서버가 연결을 수락하면 생활이 좋습니다.
여기서도 반환 값은 0
좋거나 1
나쁩니다. 우리는 단지 빠른 부울 검사를 원하기 때문에 여기서는 모든 출력을 삭제합니다. 네트워크 주소에 접근할 수 있는 경우 이 메서드는 매우 빠르게 반환됩니다. 서버 자체에서 실행하면 자체 통신을 시도할 때 지연이 거의 발생하지 않습니다.
오토메이션
cron을 통해 이러한 테스트를 실행하려면 bash 스크립트를 생성하고 명령 중 하나 또는 둘 다를 실행하고 일련의 논리적 검사를 실행하십시오. 실패하면 스크립트를 다시 시작하고 다시 확인하세요. 나는 몇 년 동안 이러한 방법을 사용해 왔으며 실제 가동 시간 측면에서 매우 좋은 결과를 얻었습니다.
답변2
파티에 조금 늦었어요..
다시 시작된 데몬을 사용하면 프로그램과 bash 스크립트를 실행할 수 있습니다. Restartd는 목록에 있는 프로그램이 실행 중인지 여부를 20초마다(구성 가능) 확인합니다.
매뉴얼 페이지를 참조하세요여기
답변3
이것이 XY 문제를 해결하는지 확실하지 않습니다.
if ps -C php -o args h | grep -q server.php
then true ## php server.php running
else php server.php ## not running
fi
메모
-C php
PHP 인스턴스를 검색합니다.-o args
전체 명령줄이 표시됩니다.h
제목 없음
grep
-q
조용한
프로그램이 php server.php
실행 중인지 확인하고, 프로그램이 중지되면 프로세스가 여기에 있고 다시 시작되지 않습니다.
실제 솔루션은 어떤 연결이 있어도 server.php를 폴링하여 시간 초과 없이 알고 있는 답변을 얻을 것으로 기대하는 것입니다. 실패하면 다시 시작하세요.