if 및 -z를 사용하여 프로세스가 실행 중인지 테스트합니다.

if 및 -z를 사용하여 프로세스가 실행 중인지 테스트합니다.

내 시스템에는 충돌로 악명 높고 일종의 업무상 중요한 프로세스가 있습니다, 내 네트워크 관리자님. 어쨌든, 실행 중인지 테스트하고 그렇지 않으면 시작하는 루프를 작성해야 합니다. 지금까지 내가 생각해낸 내용은 다음과 같습니다.

#!/bin/bash

while [ true ]; do 
    if [ -z $(ps aux | grep "[n]m-applet") ]; then
        echo "Bugger died, resurrecting..."
        nm-applet >/dev/null 2>/dev/null &
        disown $!
    fi

    sleep 3
done 

불행하게도 이 방법으로 문제가 완전히 해결되지는 않습니다. 필요하지 않은 경우에도 프로세스가 시작되는 것처럼 보이고 처음 실행 후에는 다음과 같은 오류 출력이 표시됩니다.

line 4: [: too many arguments

내가 여기서 뭘 잘못하고 있는 걸까?

답변1

$(...)큰따옴표로 묶어 보세요 .

if [ -z "$(ps aux | grep '[n]m-applet')" ]; then

pgrep하지만 대신에 or 을 사용해 볼 수도 있습니다 ps axo cmd | grep '[n]m-applet'.

답변2

-z에 여러 인수를 제공하면 오류가 발생합니다. 이는 단항 연산자이며 $()$IFS가 포함된 항목으로 확장되면 여러 인수가 표시됩니다. 이 문제를 해결하려면 다음과 같이 주위에 따옴표를 붙일 수 있습니다 [ -z "$(ps...)" ].

[]이 경우 grep이 아무것도 찾지 못하면 0이 아닌 값을 반환하기 때문에 실제로 test()가 필요하지 않습니다. 넌 할 수있어:

if ps aux | grep '[n]m-applet' > /dev/null; then

배포하려는 시스템에 해당 패턴이 있는지 확인하고 싶을 수도 있습니다 pgrep. 패턴과 일치하는 프로세스를 찾도록 설계되었습니다.

또한 스크립트가 nm-applet을 배경으로 설정하는 것을 원하지 않을 수도 있습니다. 이런 식으로 스크립트는 nm-applet이 종료될 때까지 차단됩니다.

마지막으로 살펴보고 싶을 수도 있습니다.감시 장치, 이는 스크립트가 수행하는 작업을 수행하도록 설계되었습니다.

답변3

이유가 무엇인지 잘 모르겠습니다 while [ true ]; do. 두 번째입니다.알체고의 조언사용 pgrep.

#!/bin/bash
while true; do 
    if ! pgrep nmapplet &>/dev/null; then
       echo "Bugger died, resurrecting..."
       nm-applet &>/dev/null
       disown $!
    fi
    sleep 3
done

관련 정보