pidof -x $ 0返回2而不是预期的1,是否有单线替代?

时间:2014-11-25 11:31:56

标签: linux bash shell

在bash脚本中,我正在尝试使用以下行来确定另一个进程是否正在执行当前脚本:

/sbin/pidof -x $0 |wc -w

但响应总是2,而不是预期值1。

我尝试过以下电话:
/sbin/pidof -x $0返回1个pid
/sbin/pidof -x $0 |wc -w返回2
/sbin/pidof -x $0 |head返回2个pids
/sbin/pidof -x $0 |head |wc -w返回2
/sbin/pidof -x $0 |head |tail返回2个pids
/sbin/pidof -x $0 |head |tail |wc -w返回2

任何人都可以建议替代(或修复)来实现我正在尝试做的事情,并解释为什么管道输出到任何东西导致pidof输出“有点搞笑”?

<小时/> 这是脚本当前使用pidof的方式,它可以正常工作:

RUNNING=`/sbin/pidof -x $0`
RUNNING=`echo -n ${RUNNING} | wc -w`
[[ ${RUNNING} -gt 1 ]] && return

1 个答案:

答案 0 :(得分:1)

如果您只是想阻止第二个正在运行的脚本,则以下操作将起到作用:

pid=/tmp/$(basename $0).pid
[ -e $pid ] && exit 0;
trap 'rm -f $pid >/dev/null 2>&1;' 0
trap 'exit 2' 1 2 3 15
touch $pid

用这些行开始你的脚本。基本上它会检查文件并在文件存在时停止执行。请注意,如果您终止(-9)正在运行的脚本,则您负责清理已创建的pid文件。 Kill(-9)绕过shell陷阱,否则会清理pid文件。