애플리케이션이 Linux에서 계속 실행 확인하는 방법
펼쳐지는 개발 서버에서 실행 중인지 확인합니다. 통계를 수집하고 웹 서비스를 제공하는 지속되어야하지만 하루에 몇 번 알 수없는 종료됩니다. 우리가 그것을 시작한다는 것을, 다시 시작한다는 것입니다.
내 안의 프로그래머는 문제의 원인이되는 데 몇 시간을 보내고 싶어하지만 내 안의 바쁜 사람은 앱이 실행되고 있지 않은지 감지하고 다시 찾기 쉬운 방법이 있습니다.
grep을 통해 ps를 cron-script 할 수 있는 것을 알고 있습니다 .
ps -A | grep appname
하지만 다시 말하지만, 이미 존재해야하는 작업에 사용할 수있는 또 다른 시간입니다. 계속 (옵션으로 옵션으로 실행되는) 실행 가능한 프로세스 인수를 무기한으로 계속 수있는 미리 만들어진 앱이 없습니까?
차이가 있다면 우분투입니다.
알림 : Upstart는 유지 관리 모드이며 systemd를 사용하는 Ubuntu 에서 중단 되었습니다. 서비스 정의를 작성하는 방법에 대한 자세한 내용 은 systemd의 매뉴얼 을 확인해야합니다 .
우분투 사용를 하고 있으므로 기존 SYSV의 init을 대체 한 갑자기 출세에 관심이있을 수 있습니다 . 한 가지 주요 기능은 서비스가 중단 될 경우 서비스를 다시 시작할 수 있습니다. 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의 "다시 시작"기능 을 사용할 수 있습니다 . 시스템 서비스로 설정하거나 특정 사용자가 관리하고 실행해야합니다. 이는 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 를 참조하십시오 .
실행을 루프에 넣으십시오. 종료되면 다시 실행됩니다 ... while (true) {run my app ..}
나는 cron "killall -0 programname || /etc/init.d/programname start"에서 사용했습니다. 프로세스가 존재하지 않으면 kill 오류가 발생합니다. 존재하는 경우 프로세스에 null 신호를 전달합니다 (커널이 무시하고 전달하지 않습니다).
이 관용구는 기억하기 쉽습니다 (IMHO). 일반적으로 서비스 자체가 실패하는 이유를 찾으려고 노력하는 동안 이것을 사용합니다. IMHO 프로그램이 예기치 않게 사라지면 안됩니다. :)
어떤 이유로 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
의 supervise
도구는 daemontools
내가 선호하는 것이지만 Dan J Bernstein이 쓰는 모든 것이 내가 선호하는 것입니다. :)
http://cr.yp.to/daemontools/supervise.html
응용 프로그램 시작 스크립트에 대한 특정 디렉터리 구조를 만들어야하지만 사용이 매우 간단합니다.
우선,이 앱을 어떻게 시작합니까? 배경으로 분기됩니까? nohup .. & etc로 시작 되었나요? 후자 인 경우 nohup.out에서 왜 죽었는지 확인하고 첫 번째 인 경우 로깅을 빌드합니다.
주요 질문에 관해서는 : 당신은 그것을 cron 또는 백그라운드에서 다른 프로세스를 실행하고 (최선의 선택이 아님) bashscript에서 pidof를 사용할 수 있습니다.
if [ `pidof -s app` -eq 0 ]; then
nohup app &
fi
inittab에서 시작된 서비스로 만들 수 있습니다 (일부 Linux는 /etc/event.d에서 더 새로운 것으로 이동했지만). 이러한 내장 시스템은 자체 스크립트를 작성하거나 새로운 것을 설치하지 않고도 서비스가 계속 실행되도록합니다.
DMD (데몬 모니터링 데몬)를위한 작업입니다. 주변에 몇 가지가 있습니다. 하지만 보통 데몬이 실행 중인지 확인하는 스크립트를 작성하고 그렇지 않은 경우 실행하고 cron에 넣어 매분 실행합니다.
"Unix Hater 's Handbook" (PDF의 여러 소스 중 하나 nanny
)의 9 장 (p197 또는 그 정도)에서 참조 된 ' '를 확인하십시오 .
이 작업을 수행하는 간단하고 좋은 방법은 다음과 같습니다.
- 예상하는 포트에서 수신 할 수없는 경우 서버가 죽도록 작성하십시오.
- 1 분마다 서버 시작을 시도하도록 cronjob 설정
실행되지 않으면 시작되고 실행 중이면 실행되지 않습니다. 어쨌든 서버는 항상 작동합니다.
더 나은 해결책은 함수를 테스트하는 것입니다. 예를 들어 아파치를 테스트해야한다면 시스템에 "아파치"프로세스가 있는지 테스트하는 것만으로는 충분하지 않습니다.
아파치가 정상인지 테스트하려면 간단한 웹 페이지를 다운로드하고 고유 코드가 출력에 있는지 테스트하십시오.
그렇지 않은 경우 -9로 아파치를 종료 한 다음 다시 시작하십시오. 그리고 루트 (회사 / 서버 / 프로젝트의 루트로 전달 된 메일 주소)에게 메일을 보냅니다.
더 간단합니다.
#!/bin/bash
export DISPLAY=:0
process=processname
makerun="/usr/bin/processname"
if ! pgrep $process > /dev/null
then
$makerun &
fi
하지만 프로세스 이름이 고유한지 확인해야합니다.
참고 URL : https://stackoverflow.com/questions/298760/how-to-make-sure-an-application-keeps-running-on-linux
'ProgramingTip' 카테고리의 다른 글
with-block 외부에서 사용할 수있는 with-statement로 정의 된 변수? (0) | 2020.10.04 |
---|---|
mongodb에서 pandas로 데이터를 가져 오는 방법은 무엇입니까? (0) | 2020.10.04 |
jQuery.extend와 jQuery.fn.extend의 차이점은 무엇입니까? (0) | 2020.10.04 |
저장 후 몽구스 채우기 (0) | 2020.10.04 |
숫자 만 허용되는 입력을 제한 귀하가 허용합니까? (0) | 2020.10.04 |