프로세스가 백그라운드에서 이미 실행 중인지 확인하는 배쉬 방법 (및이를 기반으로 다시 실행 생략)?


11

프로세스가 아직 백그라운드에서 실행되고 있지 않은 경우 특정 명령 만 실행하는 bash 명령 줄을 만들 수 있습니까?

명령이 이미 실행중인 경우 어떻게 확인 *합니까?

(따라서 다음 명령을 추가하여 첫 번째 명령 &&이 참인 경우에만 다음 명령을 실행할 수 있습니다).

* : 테스트, 결정, 발견, 발견


3
ps -ef | grep -v grep | grep "process_name" || run_command_here
Rahul Patil 2016 년

1
@RahulPatil pgrep "process_name"대신 사용할 수 있습니다ps | grep | grep
rush

흠, 나는 그것을 잊었다 .. : D
Rahul Patil

1
"잠금"파일을 사용하지 않는 이유는 무엇입니까? 두 번째로 시작할 때는 잠금 파일이 사라질 때만 실행됩니다.
BitsOfNix 2016 년

검사에 가장 좋은 방법은 프로세스가있는 경우 : stackoverflow.com/questions/3043978/...
트레버 보이드 스미스

답변:



3

나는 때때로이 기술을 사용했다 :

$ pgrep <process name> || <process name>

이전에 pgrep이런 식으로 수행 하기 전에 :

$ ps -eaf | grep -q <[p]rocess name> || <process name>

와 비트 는 결과적으로 자체를 찾을 수 [p]없도록합니다 grep.

$ ps -eaf | grep -q [s]leep || sleep 10

2

독립적으로 존재하는 동일한 프로세스의 개별 인스턴스를 가질 수 있기 때문에 까다로울 수 있습니다. 예를 들어 다른 포트에서 수신 대기하는 서버 또는 다른 사용자로 실행되는 서비스. 이러한 인스턴스를 구별하려면 각 인스턴스에 고유 한 태그를 지정해야합니다. 태그는 종종 파일이지만 추상 네임 스페이스, TCP 포트 등의 로컬 소켓 일 수 있습니다. 모든 고유 식별자가 수행합니다. 태그가 파일 인 경우 프로세스 ID (pidfile)를 포함하는 일반 파일이거나 파일이 수신중인 명명 된 파이프 또는 소켓 등일 수 있습니다. 이상적으로, 태그는 클라이언트가 연결할 수있는 통신 엔드 포인트입니다. 그 과정에.

이러한 각기 다른 종류의 태그는 찾고자하는 인스턴스가 시작되어 실행 중인지 다른 방식으로 확인합니다. 예를 들어, 로컬 파일 소켓을 사용하여 연결을 시도하고 해당 소켓에서 수신 대기하는 프로세스가없는 경우 프로세스를 시작하십시오. 태그가 pidfile 인 경우 해당 프로세스 ID를 가진 프로세스가 있는지 확인하십시오. 그러나 프로세스가 종료되면 해당 ID를 재사용 한 관련없는 프로세스가있을 수 있으므로이 프로세스는 취약하다는 점에주의하십시오. 두 명의 클라이언트가 짧은 시간 내에 프로세스에 도달하려고하면 프로세스가 존재하지 않으며 프로세스를 시작하려고 시도 할 수 있습니다. 이 경쟁 조건으로부터 적절히 보호하는 것은 까다로울 수 있습니다.

인스턴스가 모두 동일한 수퍼바이저 프로세스에 의해 시작될 때 인스턴스를 관리하는 것이 더 쉬우 며, 해당 수퍼바이저 프로세스는 인스턴스가 언제 죽고 그에 따라 반응하는지 감지합니다. 이를 수행 할 수있는 많은 서비스 모니터링 프로그램 .

프로그램이 알려진 통신 엔드 포인트에서 응답하지 않고 수퍼바이저 프로그램에 의해 관리되지 않는 경우 가난한 사람의 태그는 프로세스 ID를 포함하는 파일 인 pidfile입니다. 프로세스를 시작할 때 미리 지정된 이름을 가진 파일에 pid를 씁니다. 프로세스가 존재해야하는 경우 pidfile을 읽고 해당 pid가있는 프로세스가 있는지 확인하십시오. 프로세스를 종료하면 pidfile을 지우십시오. 감독되지 않은 pidfile의 가장 두드러진 문제는 프로세스가 종료되면 관련되지 않은 일부 프로세스에서 해당 pid를 재사용 할 수 있다는 것입니다. 프로세스 이름 또는 프로세스 실행 파일을 확인하여 올바른 프로세스와 대화하고 있는지 확인해야합니다. 많은 유닉스 변형에는 pgrep 명령이 있습니다.pgrep SOMENAME 이름에 SOMENAME이 포함 된 프로세스를 하위 문자열로 나열하고, 특정 사용자로 제한하고, 정확히 일치해야하며, 사용 가능한 여러 "프로세스 이름"개념을 변경하는 등의 추가 옵션이 있습니다.


1

이 방법을 사용할 수 있습니다.

if [[ -z $(ps -C appname -opid=) ]]; then
    appname && secondapp
fi

1

다른 옵션:

  • pgrep -xq processname
    • GNU / Linux에서 처음 15 자만 일치
    • OS X에 조상을 포함하지 않습니다
  • ps -eo comm= | sed 's|.*/||' | grep -xq processname
    • GNU / Linux에서 처음 15 자만 일치
    • sed 's|.*/||' OS X에서 dirname 부분을 제거합니다

GNU에서 / 리눅스 ps -o comm자릅니다은 15 자 이름을 명령 pgrep하고 ps -C첫 번째 15 자와 일치합니다.

ps -C OS X에서는 (일치 명령 이름)이 지원되지 않습니다.

OS X에서는 ps -o comm명령의 절대 경로를 ps -co comm인쇄하고 명령 이름 만 인쇄합니다. GNU에서는 ps -o comm명령 이름 만 인쇄 -c하며 다른 의미를 갖습니다.

OS X의 pgrep에는 bash, Terminal 또는 launchd와 같은 상위 프로세스가 포함되지 않습니다 -a. GNU의 pgrep에는 기본적으로 포함되어 있으며 지원하지 않습니다 -a.

grep -xpgrep -x의미하지는 않습니다 -F, 사용 있도록 -Fx프로세스 이름은 정규식 문자를 포함 할 수 있습니다.


-C도 cygwin에서 사용할 수 없습니다 :)
n611x007

1

죄송합니다. 동일한 명령 줄이 'ps'결과에 두 번 표시되므로 이러한 모든 솔루션이 Contab을 지원하지 않습니다.

그래서 여기 내 것이 있습니다 :

## Test pour voir si le même script tourne déjà
## Un fichier .pid est utilisé pour stocké le numéro de process
## Si le pid est en train de tourner alors on sort.
lock_file=$0".pid"
[ -r $lock_file ] && read pid <$lock_file
if [ "$pid" -gt 1 ] && [ `ps --no-headers -p "$pid" | wc -l` -gt 0 ] ; then
    echo "WARNING : le process $pid tourne deja : $0"
    ps -edf | grep `basename $0` | grep -v grep
    echo "WARNING : Arrêt de cette instance ($$)."
    exit 7
fi
echo $$ >$lock_file

죄송합니다 Contab이란 무엇입니까? cron직장 내에서 확인하는 것을 의미 합니까?
Anthon

0

배쉬

#!/usr/bin/env bash

[[ $# -eq 0 ]] && { echo -e "Usage:\t\t $0 <Process_name>  <Command here>"; exit 1;  }

ifnotrun(){
        local p=$1
        if ! ps -C "$1" -opid=
        then
                cmd=($@)
                echo ${cmd[@]:1}
        else
                echo "Process \"$p\" Already Running.."
                exit 1
        fi

}

ifnotrun $*

참고 :- echo출력이 Ok이면 제거하십시오 .


0

beckgreoud에서 명령을 실행하는 경우를 설명하겠습니다. "$!" 마지막 백그라운드 프로세스의 PID를 저장하십시오. 따라서 위의 답변에 따라 프로세스 테이블에서 찾을 수 있습니다.

sleep 4 &
ps -ef | grep -w  $!  ...

내장 명령 "작업"-다음을 시도하십시오.

sleep 4&
J=`jobs`
while [ "$J" ]; do
        sleep 1
        jobs # This line flush the jobs' bufer.
        J=`jobs`
done

"&&"옵션에 대하여

&& 대신 명령 대기를 사용하십시오. 다음 예제에서 myproc1은 myproc1이 완료 될 때까지 실행되지 않습니다.

myproc1 &
wait
myproc2

0

프로세스 상태를 확인하십시오.

ps -lp $(pgrep <YOUR_PROCESS_NAME>) | tail -1 | awk '{print $11}'

참고:

D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

예를 들어, tmux 세션에서 조건부로 삭스 프로세스를 재생하거나 일시 중지하는 데 사용했습니다.

/usr/local/bin/tmux if-shell -t sox "[ $(ps -lp $(pgrep sox) | tail -1 | awk '{print $11}') == 'T' ]" \
  'send -t sox "fg" Enter' \
  'send -t sox C-z'

-1

스크립트 안에서 사용할 수 있습니다 :

if [ `ps -ef | grep "script.sh" | grep -v grep | wc -l` -gt 1 ] ; then
echo "RUNNING...."
else
echo "NOT RUNNING..."
fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.