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


83

스크립트가 개발 서버에서 계속 실행되도록 노력하고 있습니다. 통계를 수집하고 웹 서비스를 제공하므로 지속되어야하지만 하루에 몇 번 알 수없는 이유로 사라집니다. 우리가 그것을 다시 시작하는 것을 알았을 때, 그것은 뒤쪽이 고통스럽고 일부 사용자는 그것을 시작할 권한 (또는 노하우)이 없습니다.

내 안의 프로그래머는 문제의 원인을 파악하는 데 몇 시간을 보내고 싶지만 내 안의 바쁜 사람은 앱이 실행되고 있지 않은지 감지하고 다시 실행할 수있는 쉬운 방법이 있어야한다고 생각합니다.

grep을 통해 ps를 cron-script 할 수 있다는 것을 알고 있습니다 .

ps -A | grep appname

그러나 다시 말하지만, 그것은 이미 존재해야하는 일을하는 데 낭비되는 내 인생의 또 다른 시간입니다. 실행 파일 (옵션으로 인수 포함)을 전달할 수 있고 프로세스를 무기한으로 계속 실행할 수있는 미리 만들어진 앱이 없습니까?

차이가 있다면 우분투입니다.


1
스크립트가 실행되지 않을 때 통계가 손실되는지 여부에 따라 다르지만 프로그래머가 옳다고 생각합니다. 스크립트가 무기한으로 계속되지 않는 이유에 대해 자세히 알아봐야합니다.
Jonathan Leffler

1
지속적으로 숫자를 계산하는 것보다 주문형 서비스 유틸리티에 가깝습니다. 데이터를 저장하기 전에 충돌이 발생하면 아무것도 손실되지 않습니다. 다음에 실행할 때 작업이 완료됩니다.
Oli


질문은 Standard 또는 init.d에 의해 시작된 활성 상태를 유지하는 가장 좋은 방법 에서 답변되었습니다 . 솔루션에는 systemd 및 /etc/inittab.
koppor

답변:


37

알림 : 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

서비스를 관리하고 계속 실행하도록 upstart를 구성하는 것은 매우 간단합니다 (작은 구성 파일 작성). 이 솔루션은 다른 "간단한"cron / shell 스크립트 기반 모니터링보다 훨씬 깨끗하고 간단하며 우수합니다.
토르

@thor-(참고, 이것은 2008 년에 새로 시작되었고 문서화가 더 어려웠던 때입니다). 동의합니다. "간단한"cron 스크립트는 스크립트가 작업을 수행하는 데 복잡 할 필요가 없음을 설명하기위한 것입니다.
JimB

내가 참조. 나는 내 의견을 배치 할 때 어쨌든 당신의 대답을 upvoted
thor

85

프로그램이 실행 중인지 확인하기 위해 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 분마다 크론 작업을 추가하십시오.


2
그것은 천재입니다. 재부팅 후 설치할 필요가 없습니다.
Ian Purton 2011 년

설치하는 데 루트 권한이 필요하지 않기 때문에 직접 사용했습니다.
JohnMudd

무엇을 할 process name내가 파이썬 스크립트의 실행을 유지하려는 경우 수?
사용자

@User ps ax | grep XXX프로세스 만 나열하는 데 사용 하면 XXX가됩니다.
strongwillow

11
cron one-liner로 1 분에 한 번 실행합니다.* * * * * ps aux|grep -v grep|grep -q YourProcessName || /usr/bin/program &
ACK_stoverflow

43

Monit 은 이것에 완벽합니다 :)

감시하라고 monit에게 알려주는 간단한 설정 파일 (예 : TCP 포트, PID 파일 등)을 작성할 수 있습니다.

monit은 모니터링중인 프로세스를 사용할 수 없거나 너무 많은 메모리를 사용하거나 CPU를 너무 오래 고정하는 등의 경우 지정한 명령을 실행합니다. 또한 무슨 일이 일어 났는지, 그리고 그것에 대해 무엇을 할 수 있는지를 알려주는 이메일 경고가 나타납니다.

우리는 이것을 사용하여 웹 사이트를 계속 실행하고 문제가 발생하면 조기에 경고합니다.

-당신의 충실한 직원 Monit


19
Monit을 어떻게 계속 실행합니까?
JohnMudd

2
이것은 배우기가 꽤 어렵습니다. 서비스 대신 스크립트를 다시 시작하고 싶고 몇 시간 동안 문서를 읽었지만 알아낼 수 없었습니다.
Tyler Long

21

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 를 참조하십시오 .


좋은 대답이지만 ~ / .config / systemd / user / something.service는 나에게 약간 모호했습니다. "사용자"부분은 문자 그대로 "사용자"입니까, 아니면 "사용자 이름"과 비슷합니까? "yourusername"인 경우 홈 디렉토리에이 파일을 만들고 있으므로 중복 된 것으로 간주됩니다. 편집 : 말 그대로 "사용자"인 것 같습니다
fivedogit

8

나는 cron "killall -0 programname || /etc/init.d/programname start"에서 사용했습니다. 프로세스가 존재하지 않으면 kill 오류가 발생합니다. 존재하는 경우 프로세스에 null 신호를 전달합니다 (커널이 무시하고 전달하지 않습니다).

이 관용구는 기억하기 쉽습니다 (IMHO). 일반적으로 서비스 자체가 실패하는 이유를 찾으려고 노력하는 동안 이것을 사용합니다. IMHO 프로그램이 예기치 않게 사라지면 안됩니다. :)


7

실행을 루프에 넣으십시오. 종료되면 다시 실행됩니다 ... while (true) {run my app ..}


4
스크립트가 알 수없는 이유로 죽어가는 경우 루프 스크립트도 취소 될 가능성이 높습니다.
Gareth

4
Im with Garath, 시스템이 장기 실행 프로세스를 종료하는 경우 제안 된 루프 (앱 이전에 시작)가 먼저 종료됩니다.
ekerner

2
두 가지 의견에 답하려면 : 아니요, 스크립트가 알 수없는 이유로 죽는 경우 루프 스크립트는 별도의 프로세스에서 실행되기 때문에 영향을받지 않습니다.하지만 예, 시스템이 장기 실행 프로세스를 무작위로 종료하는 경우 여전히 문제가됩니다. -그러나 나는 그것이 사실인지 의심합니다. 나머지 시스템은 영향을받은 것으로보고되지 않았으며 다시 시작되었을 다른 장기 실행 프로세스로 가득 차 있습니다 (문제가있는이 스크립트 하나만 언급했습니다).
Klathzazt

4

어떤 이유로 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

1
Chris Wendt의 솔루션과 비교할 때 스크립트는 여기서 백그라운드 작업으로 시작되지 않습니다.
Mason

2

supervise도구는 daemontools내가 선호하는 것이지만 Dan J Bernstein이 쓰는 모든 것이 내가 선호하는 것입니다. :)

http://cr.yp.to/daemontools/supervise.html

응용 프로그램 시작 스크립트에 대한 특정 디렉터리 구조를 만들어야하지만 사용이 매우 간단합니다.


1

우선,이 앱을 어떻게 시작합니까? 배경으로 분기됩니까? nohup .. & etc로 시작 되었나요? 후자의 경우 nohup.out에서 왜 죽었는지 확인하고, 첫 번째 인 경우 로깅을 빌드합니다.

주요 질문에 관해서는 : 당신은 그것을 크론하거나 백그라운드에서 다른 프로세스를 실행하고 (최선의 선택이 아님) bashscript에서 pidof를 사용할 수 있습니다.

if [ `pidof -s app` -eq 0 ]; then
    nohup app &
fi

1

inittab에서 시작된 서비스로 만들 수 있습니다 (일부 Linux는 /etc/event.d에서 더 새로운 것으로 이동했지만). 이러한 내장 시스템은 자체 스크립트를 작성하거나 새로운 것을 설치하지 않고도 서비스가 계속 실행되도록합니다.


1

DMD (데몬 모니터링 데몬)를위한 작업입니다. 주변에 몇 가지가 있습니다. 하지만 보통 데몬이 실행 중인지 확인하는 스크립트를 작성하고 그렇지 않은 경우 실행하고 cron에 넣어 매분 실행합니다.



1

이 작업을 수행하는 간단하고 좋은 방법은 다음과 같습니다.

  1. 예상하는 포트에서 수신 할 수없는 경우 서버가 죽도록 작성하십시오.
  2. 1 분마다 서버 시작을 시도하도록 cronjob 설정

실행되지 않으면 시작되고 실행 중이면 실행되지 않습니다. 어쨌든 서버는 항상 작동합니다.


0

더 나은 해결책은 함수를 테스트하는 것입니다. 예를 들어 아파치를 테스트해야한다면 시스템에 "아파치"프로세스가 있는지 테스트하는 것만으로는 충분하지 않습니다.

아파치가 정상인지 테스트하려면 간단한 웹 페이지를 다운로드하고 고유 코드가 출력에 있는지 테스트하십시오.

그렇지 않은 경우 -9로 아파치를 종료 한 다음 다시 시작하십시오. 그리고 루트 (회사 / 서버 / 프로젝트의 루트로 전달 된 메일 주소)에게 메일을 보냅니다.


1
사실입니다. 다른 답변에서 제안 된 많은 모니터링 솔루션은 프로토콜 모니터링을 제공합니다.
Oli

0

더 간단합니다.

#!/bin/bash

export DISPLAY=:0

process=processname
makerun="/usr/bin/processname"

if ! pgrep $process > /dev/null
then
    $makerun &
fi

하지만 프로세스 이름이 고유한지 확인해야합니다.


0

다음과 같이 정밀 모니터링 cronjob을 설치할 수 있습니다.

crontab -l> crontab; echo -e '* * * * * export DISPLAY = ": 0.0"&& for app in "eiskaltdcpp-qt" "transmission-gtk" "nicotine"; do ps aux | grep -v grep | grep "$ app"; done || "$ app"& '>> crontab; crontab crontab

단점은 입력 한 앱 이름이 ps aux|grep "appname"출력에서 발견되어야 하고 동시에 해당 이름을 사용하여 시작할 수 있어야한다는 것입니다."appname" &

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.