我创建了一个基本上是用C编写的守护进程的应用程序。它使用shell脚本停止并启动。具体来说,为了阻止它,kill用于发送SIGTERM信号。守护程序的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脚本中是否存在可能导致某些平台出现问题的错误?
答案 0 :(得分:1)
当您将kill
空arg作为PID传递时,会发生该错误,即
[me@home]$ kill -n SIGTERM ""
kill: `': not a pid or valid job spec
我的猜测是,当PID_FILE存在但是为空时,你的脚本会抛出该错误,因此${FCPID}
最终为空字符串。
检查启动脚本是否实际在用户的计算机上正确写出了PID_FILE。
答案 1 :(得分: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
答案 2 :(得分:1)
在你的shebang行添加标志-kvx(假设你正在使用ksh),如下所示。
#!usr/bin/ksh -kvx
执行脚本后,您可以清楚地看到传递给kill命令的参数是什么。