bash 스크립트에서 가동 시작 상태를 확인하는 방법은 무엇입니까? 내에서 시작 작업이 실행 중인지 어떻게

Bash 스크립트 내에서 시작 작업이 실행 중인지 어떻게 확인합니까? 즉, 다음과 같은 작업을 수행하려면 “부울”값이 필요합니다.

#!/bin/bash
if [ determine_if_job_x_is_running ]; then
  echo "I see upstart job X is running, please stop it before ..."
fi



답변

나만의 Bash 함수를 만들고 이것을 다음에 넣으십시오 ~/.bashrc.

check_upstart_service(){
    status $1 | grep -q "^$1 start" > /dev/null
    return $?
}

나는 출력을 파싱하는 방법을 정말로 좋아하지 않지만 다른 분명한 방법은 보이지 않습니다. 이 경우 Upstart documentation에<service name> start 지정된 출력 이 매우 안정적 입니다.

이제 다음과 같이 사용할 수 있습니다.

if check_upstart_service ssh; then echo "running"; else echo "stopped"; fi


답변

일반적으로 PID 파일을 사용하지만 pgrep을 사용하여 프로세스를 확인할 수도 있습니다. 서비스가 jobX다음과 같이 작동 한다고 가정하십시오 .

if [ $(pgrep jobX) ]; then

아니면 더 나은

if pgrep jobX > /dev/null 2>&1


답변

bash에 포함 된 문자열을 기반으로합니다 .

job='your_job_name'
job_status=$(status ${job})
if [[ ${job_status} == *running* ]]
  then
    # do whatever you need
  else
    # do whatever you need
fi

첫 번째 충동은 ImaginaryRobots에서 제공 한 코드 변형을 사용하는 것이 었습니다

job='your_job_name'
dbus-send --system --print-reply --dest=com.ubuntu.Upstart \
  /com/ubuntu/Upstart/jobs/${job}/_ \
  org.freedesktop.DBus.Properties.Get string:'' string:state

어떤 것을 반환합니다

메소드 return sender = : 1.0-> dest = : 1.94 reply_serial = 2 변형 문자열 “running”

위의 솔루션을 사용하여 반환 된 문자열에 “running”이 포함되어 있는지 확인하십시오. 그러나 작업이 실행 중이 아닌 경우 dbus 호출은 예상대로 “대기 중”을 반환하는 상태 1로 종료됩니다.

status ${job} 그러한 작업이없는 경우를 제외하고는 상태 1로 종료되지 않습니다.


답변

DBUS를 사용하여 해당 특정 서비스의 상태를 쿼리합니다.

$ job=myjob
$ dbus-send --system --print-reply --dest=com.ubuntu.Upstart /com/ubuntu/Upstart/jobs/${job}/_ org.freedesktop.DBus.Properties.GetAll string:''

http://upstart.ubuntu.com/cookbook/#get-status-of-job-via-d-bus

자체 시작 작업을 작성하는 경우 대신 시작 이벤트 또는 패키지 종속성을 사용해야합니다.


답변

upstart status 명령은 Linux Standard Base 프로젝트의 init 스크립트 사양을 따르는 것으로 보입니다. 즉, 종료 코드 0은 프로그램이 실행 중임을 의미하고 종료 코드 1-3은 실행 중임을 의미하며 다른 종료 코드는 정의되지 않은 상태를 의미합니다.

참조 :
http://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/iniscrptact.html


답변