스크립트가 개발 서버에서 계속 실행되도록 노력하고 있습니다. 통계를 수집하고 웹 서비스를 제공하므로 지속되어야하지만 하루에 몇 번 알 수없는 이유로 사라집니다. 우리가 그것을 다시 시작하는 것을 알았을 때, 그것은 뒤쪽이 고통스럽고 일부 사용자는 그것을 시작할 권한 (또는 노하우)이 없습니다.
내 안의 프로그래머는 문제의 원인을 파악하는 데 몇 시간을 보내고 싶지만 내 안의 바쁜 사람은 앱이 실행되고 있지 않은지 감지하고 다시 실행할 수있는 쉬운 방법이 있어야한다고 생각합니다.
grep을 통해 ps를 cron-script 할 수 있다는 것을 알고 있습니다 .
ps -A | grep appname
그러나 다시 말하지만, 그것은 이미 존재해야하는 일을하는 데 낭비되는 내 인생의 또 다른 시간입니다. 실행 파일 (옵션으로 인수 포함)을 전달할 수 있고 프로세스를 무기한으로 계속 실행할 수있는 미리 만들어진 앱이 없습니까?
차이가 있다면 우분투입니다.
답변
알림 : Upstart는 유지 관리 모드이며 systemd를 사용하는 Ubuntu 에서 중단 되었습니다. 서비스 정의를 작성하는 방법에 대한 자세한 내용 은 systemd의 매뉴얼 을 확인해야합니다 .
Ubuntu를 사용 하고 있으므로 기존 sysV init을 대체 한 Upstart에 관심이있을 수 있습니다 . 한 가지 주요 기능은 서비스가 예기치 않게 종료 될 경우 서비스를 다시 시작할 수 있다는 것입니다. Fedora는 신생 기업으로 이동했으며 Debian은 실험 단계에 있으므로 살펴볼 가치가 있습니다.
cron 스크립트를 구현하는 데 2 분이 걸리기 때문에이 상황에서는 과도 할 수 있습니다 .
#!/bin/bash
if [[ ! `pidof -s yourapp` ]]; then
invoke-rc.d yourapp start
fi
답변
프로그램이 실행 중인지 확인하기 위해 cron과 함께 간단한 스크립트를 사용했습니다. 그렇지 않은 경우 시작됩니다. 이것은 여러분이 찾고있는 완벽한 솔루션이 아닐 수도 있지만 간단하고 잘 작동합니다.
#!/bin/bash
#make-run.sh
#make sure a process is always running.
export DISPLAY=:0 #needed if you are running a simple gui app.
process=YourProcessName
makerun="/usr/bin/program"
if ps ax | grep -v grep | grep $process > /dev/null
then
exit
else
$makerun &
fi
exit
그런 다음 1 분 또는 5 분마다 크론 작업을 추가하십시오.
답변
Monit 은 이것에 완벽합니다 🙂
감시하라고 monit에게 알려주는 간단한 설정 파일 (예 : TCP 포트, PID 파일 등)을 작성할 수 있습니다.
monit은 모니터링중인 프로세스를 사용할 수 없거나 너무 많은 메모리를 사용하거나 CPU를 너무 오래 고정하는 등의 경우 지정한 명령을 실행합니다. 또한 무슨 일이 일어 났는지, 그리고 그것에 대해 무엇을 할 수 있는지를 알려주는 이메일 경고가 나타납니다.
우리는 이것을 사용하여 웹 사이트를 계속 실행하고 문제가 발생하면 조기에 경고합니다.
-당신의 충실한 직원 Monit
답변
Fedora 및 최신 Ubuntu 릴리스와 같은 systemd 기반 배포판을 사용하는 경우 서비스에 대해 systemd의 “다시 시작”기능 을 사용할 수 있습니다 . 시스템 서비스로 설정하거나 특정 사용자가 관리하고 실행해야하는 경우 사용자 서비스로 설정할 수 있으며 이는 OP의 특정 상황에서 더 많이 발생합니다.
다시 시작 옵션 중 하나를 취 no
, on-success
, on-failure
, on-abnormal
, on-watchdog
, on-abort
, 또는 always
.
사용자로 실행하려면 다음과 같은 파일을 다음 위치에 넣으십시오 ~/.config/systemd/user/something.service
.
[Unit]
Description=Something
[Service]
ExecStart=/path/to/something
Restart=on-failure
[Install]
WantedBy=graphical.target
그때:
systemctl --user daemon-reload
systemctl --user [status|start|stop|restart] something
루트 권한 / 시스템 파일 수정 필요 없음, 크론 작업 필요 없음, 설치할 필요 없음, 지옥처럼 유연함 (문서의 모든 관련 서비스 옵션 참조).
사용자 별 systemd 인스턴스 사용에 대한 자세한 내용은 https://wiki.archlinux.org/index.php/Systemd/User 를 참조하십시오 .
답변
나는 cron “killall -0 programname || /etc/init.d/programname start”에서 사용했습니다. 프로세스가 존재하지 않으면 kill 오류가 발생합니다. 존재하는 경우 프로세스에 null 신호를 전달합니다 (커널이 무시하고 전달하지 않습니다).
이 관용구는 기억하기 쉽습니다 (IMHO). 일반적으로 서비스 자체가 실패하는 이유를 찾으려고 노력하는 동안 이것을 사용합니다. IMHO 프로그램이 예기치 않게 사라지면 안됩니다. 🙂
답변
실행을 루프에 넣으십시오. 종료되면 다시 실행됩니다 … while (true) {run my app ..}
답변
어떤 이유로 Chris Wendt 솔루션이 작동하도록 할 수 없었고 디버깅하기가 어려웠습니다. 이것은 거의 동일하지만 디버그하기 쉽고 패턴 일치에서 bash를 제외합니다. 디버그하려면 다음을 실행하십시오 bash ./root/makerun-mysql.sh
.. MySQL의 서버와 다음의 예에서는 단지에 대한 변수의 값을 대체 process
하고 makerun
프로세스에 대한.
- 다음과 같은 BASH 스크립트를 만듭니다 (
nano /root/makerun-mysql.sh
) :
#!/bin/bash
process="mysql"
makerun="/etc/init.d/mysql restart"
if ps ax | grep -v grep | grep -v bash | grep --quiet $process
then
printf "Process '%s' is running.\n" "$process"
exit
else
printf "Starting process '%s' with command '%s'.\n" "$process" "$makerun"
$makerun
fi
exit
-
만들기는 확실히 그것은 (즉, 적절한 파일 권한을 추가하여 실행 파일입니다
chmod 700 /root/makerun-mysql.sh
) -
그런 다음 crontab (
crontab -e
)에 다음을 추가하십시오 .
# Keep processes running every 5 minutes
*/5 * * * * bash /root/makerun-mysql.sh