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