杀人:不是pid或有效的工作规范

时间:2011-08-23 21:15:25

标签: shell kill pid

我创建了一个基本上是用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脚本中是否存在可能导致某些平台出现问题的错误?

3 个答案:

答案 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命令的参数是什么。