2011-08-23 50 views
0

我已經創建了一個應用程序,基本上是一個用C編寫的deamon。它停止並開始使用shell腳本。具體而言,要停止它,使用kill來發送一個SIGTERM信號。守護進程的PID存儲在文件光盤上的格式爲:殺:不是一個PID或有效的工作規範

1234\n 

一個用戶報告說他們無法停止守護進程,shell腳本返回錯誤:

kill: `': not a pid or valid job spec 

的PID被取出並在shell腳本中使用如下:

if [ -f "${PID_FILE}" ] 
then 
    FCPID=`head -n 1 $PID_FILE` 
    kill -n SIGTERM "${FCPID}" 
    RETVAL=$? 
    if [ $RETVAL -eq 0 ] 
    then 
     rm -f ${PID_FILE} 
     echo "OK" 
    else 
     echo "FAIL" 
     exit 1 
    fi 
else 
    echo "Wasn't running" 
    exit 1 
fi 

它的工作原理在我的機器(Ubuntu的10.04)精細,至今沒有人報告了這個問題。有沒有人認識到這個錯誤,或者shell腳本中是否有錯誤可能導致某些平臺出現問題?

回答

1

當你通過kill空ARG作爲PID,即出現該錯誤

[[email protected]]$ kill -n SIGTERM "" 
kill: `': not a pid or valid job spec 

我的猜測是,當PID_FILE存在,但是是空的腳本拋出了這個錯誤,因此${FCPID}結束了一個空串。

檢查啓動腳本實際上是否在用戶機器上正確寫出了PID_FILE。

+0

謝謝 - 一個空的PID參數給出了這個確切的錯誤。 – SlappyTheFish

1

什麼是kill -n?我想你的意思是kill -s。另外,我們可以檢查FCPID正在設置。

FCPID=`head -n 1 $PID_FILE` 
if [ -n "${FCPID}" ] ; then 
    kill -s SIGTERM "${FCPID}" 
    ... # the rest of what happens after kill 
fi 
+0

-n標誌允許您傳遞一個信號編號而不是名稱,所以我認爲kill -n SIGTERM應該相當於kill -s TERM。有趣的是,-n選項僅在kill --help中提及,而不是在man kill中提到。任何人都可以澄清什麼是最正確的/兼容? – SlappyTheFish

+0

啊哈,所以-n選項是ksh93。 Bourne shell和C Shell似乎沒有這個,所以最兼容的就是kill -15 PID – SlappyTheFish

1

在下面的shebang行中添加標誌-kvx(假設您正在使用ksh)。

#!usr/bin/ksh -kvx 

執行腳本後,您可以清楚地看到傳遞給kill命令的參數是什麼。

相關問題