나는 2개의 PHP 스크립트를 작성했습니다. 하나는 작업자이고 다른 하나는 마스터입니다.
master를 수동으로 실행하면 Rabbitmq 시스템을 확인하고 감지한 각 대기열에 대해 1개의 작업자를 생성합니다. 그런 다음 master를 다시 실행하면 각 작업자 프로세스가 아직 실행 중인지 확인하고, 그렇다면 아무 작업도 수행하지 않고, 그렇지 않으면 다시 시작합니다.
나는 그것이 매우 간단한 개념이라고 생각한다. 나는 생성되는 각 하위 프로세스에 대해 마스터에서 nohup 및 &를 사용하여 이 작업을 수행합니다. 이제 60초마다 마스터를 실행하여 대기열이 살아 있는지 확인하고 그렇지 않으면 다시 생성할 것이라고 추측할 수 있을 것입니다.
이로 인해 문제가 발생합니다. cron 작업에서 nohub를 사용할 수 없으며 & 자체를 사용하는 것만으로는 작동하지 않는 것 같습니다. 내가 아는 한 직원은 전화조차 하지 않았다.
별도의 쉘 스크립트를 생성한 다음 master.php를 호출해 보았지만 작동하지 않았습니다. 나는 그것을 upstart 작업으로 생성하려고 시도한 후 ubuntu 17+에서 upstart가 제거되었다는 것을 기억했습니다.
나는 다른 접근 방식에 대한 어떤 제안에도 열려 있지만 어떤 경로를 택하든 내 master.php가 헤드리스 백그라운드 프로세스로 work.php 파일을 생성하도록 허용해야 합니다.
답변1
#!/bin/bash
#I am just like a system daemon...
#I do not need nohup for work, and I should not be called from cron.
#My name is main_safe
#I will become a separeted process even if my father dies...
#i will check if main is still alive, and if dies i will restart it
#nohup is not needed inside shell script.
#IMPORTANT: to die is very different from to freeze
main_safe(){
trap "" HUP
while sleep 120; do
main&
wait
done
}
#My name is main I like to keep restarting php master.php
#everytime it go away... remove wait and I will keep starting master.php with absolutely no reason.
#If you are paranoid you can program me to restart main_safe,
#But what will happen if you try to stop me? Bad things.. so...
#IMPORTANT: to die is very different from to freeze
main(){
trap "" HUP
while sleep 60; do
php master.php &
#do whatever you want here
#uncomment this to prevent two instances of master.php from going up maybe it is necessary:
wait
done
}
#nohup is not needed in shell script
main_safe&
pstree -p | grep $!
이것이 허용됩니까?
답변2
systemd를 사용하는 것은 어떻습니까? 나는 몇 가지 검색을 수행했으며 systemd가 upstart를 새 버전의 우분투로 교체함에 따라 이것이 유용할 수 있습니다. 아래 링크가 도움이 될 수 있습니다.