프로세스가 아직 백그라운드에서 실행되고 있지 않은 경우 특정 명령 만 실행하는 bash 명령 줄을 만들 수 있습니까?
명령이 이미 실행중인 경우 어떻게 확인 *합니까?
(따라서 다음 명령을 추가하여 첫 번째 명령 &&
이 참인 경우에만 다음 명령을 실행할 수 있습니다).
* : 테스트, 결정, 발견, 발견
pgrep "process_name"
대신 사용할 수 있습니다ps | grep | grep
프로세스가 아직 백그라운드에서 실행되고 있지 않은 경우 특정 명령 만 실행하는 bash 명령 줄을 만들 수 있습니까?
명령이 이미 실행중인 경우 어떻게 확인 *합니까?
(따라서 다음 명령을 추가하여 첫 번째 명령 &&
이 참인 경우에만 다음 명령을 실행할 수 있습니다).
* : 테스트, 결정, 발견, 발견
pgrep "process_name"
대신 사용할 수 있습니다ps | grep | grep
답변:
daemontools를 사용하십시오 . svok
서비스 / 데몬 / 백그라운드 프로세스가 현재 실행 중인지 확인하는 데 사용할 수 있습니다 .
다른 방법은 다음을 참조하십시오.
독립적으로 존재하는 동일한 프로세스의 개별 인스턴스를 가질 수 있기 때문에 까다로울 수 있습니다. 예를 들어 다른 포트에서 수신 대기하는 서버 또는 다른 사용자로 실행되는 서비스. 이러한 인스턴스를 구별하려면 각 인스턴스에 고유 한 태그를 지정해야합니다. 태그는 종종 파일이지만 추상 네임 스페이스, TCP 포트 등의 로컬 소켓 일 수 있습니다. 모든 고유 식별자가 수행합니다. 태그가 파일 인 경우 프로세스 ID (pidfile)를 포함하는 일반 파일이거나 파일이 수신중인 명명 된 파이프 또는 소켓 등일 수 있습니다. 이상적으로, 태그는 클라이언트가 연결할 수있는 통신 엔드 포인트입니다. 그 과정에.
이러한 각기 다른 종류의 태그는 찾고자하는 인스턴스가 시작되어 실행 중인지 다른 방식으로 확인합니다. 예를 들어, 로컬 파일 소켓을 사용하여 연결을 시도하고 해당 소켓에서 수신 대기하는 프로세스가없는 경우 프로세스를 시작하십시오. 태그가 pidfile 인 경우 해당 프로세스 ID를 가진 프로세스가 있는지 확인하십시오. 그러나 프로세스가 종료되면 해당 ID를 재사용 한 관련없는 프로세스가있을 수 있으므로이 프로세스는 취약하다는 점에주의하십시오. 두 명의 클라이언트가 짧은 시간 내에 프로세스에 도달하려고하면 프로세스가 존재하지 않으며 프로세스를 시작하려고 시도 할 수 있습니다. 이 경쟁 조건으로부터 적절히 보호하는 것은 까다로울 수 있습니다.
인스턴스가 모두 동일한 수퍼바이저 프로세스에 의해 시작될 때 인스턴스를 관리하는 것이 더 쉬우 며, 해당 수퍼바이저 프로세스는 인스턴스가 언제 죽고 그에 따라 반응하는지 감지합니다. 이를 수행 할 수있는 많은 서비스 모니터링 프로그램 .
프로그램이 알려진 통신 엔드 포인트에서 응답하지 않고 수퍼바이저 프로그램에 의해 관리되지 않는 경우 가난한 사람의 태그는 프로세스 ID를 포함하는 파일 인 pidfile입니다. 프로세스를 시작할 때 미리 지정된 이름을 가진 파일에 pid를 씁니다. 프로세스가 존재해야하는 경우 pidfile을 읽고 해당 pid가있는 프로세스가 있는지 확인하십시오. 프로세스를 종료하면 pidfile을 지우십시오. 감독되지 않은 pidfile의 가장 두드러진 문제는 프로세스가 종료되면 관련되지 않은 일부 프로세스에서 해당 pid를 재사용 할 수 있다는 것입니다. 프로세스 이름 또는 프로세스 실행 파일을 확인하여 올바른 프로세스와 대화하고 있는지 확인해야합니다. 많은 유닉스 변형에는 pgrep 명령이 있습니다.pgrep SOMENAME
이름에 SOMENAME이 포함 된 프로세스를 하위 문자열로 나열하고, 특정 사용자로 제한하고, 정확히 일치해야하며, 사용 가능한 여러 "프로세스 이름"개념을 변경하는 등의 추가 옵션이 있습니다.
다른 옵션:
pgrep -xq processname
ps -eo comm= | sed 's|.*/||' | grep -xq processname
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 -x
와 pgrep -x
의미하지는 않습니다 -F
, 사용 있도록 -Fx
프로세스 이름은 정규식 문자를 포함 할 수 있습니다.
죄송합니다. 동일한 명령 줄이 '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
cron
직장 내에서 확인하는 것을 의미 합니까?
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
프로세스 상태를 확인하십시오.
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'
ps -ef | grep -v grep | grep "process_name" || run_command_here