ProgramingTip

애플리케이션이 Linux에서 계속 실행 확인하는 방법

bestdevel 2020. 10. 4. 12:04
반응형

애플리케이션이 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. 예상하는 포트에서 수신 할 수없는 경우 서버가 죽도록 작성하십시오.
  2. 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

반응형