我有一个包含此代码段的脚本:
#!/bin/bash
set +e
if [ -O "myprog.pid" ]; then
PID=`/bin/cat myprog.pid`
if /bin/ps -p ${PID}; then
echo "Already running" >> myprog.log
exit 0
else
echo "Old pidfile found" >> myprog.log
fi
else
echo "No pidfile found" >> myprog.log
fi
echo $$ > myprog.pid
此文件由监视脚本callmyprog
调用,该脚本如下所示:
#!/bin/bash
myprog &
if /bin/ps -p ${PID}
似乎有问题。问题以这种方式表现出来。如果我在运行时手动调用myprog
,则会收到应有的消息“已经运行”。当我手动运行脚本callmyprog
时,也会发生同样的事情。但是,当看门狗运行它时,我反而得到了“找到旧的pidfile”。
我已经检查了ps
的输出,并在所有情况下都找到了过程。当我手动(直接或通过myprog
调用callmyprog
时,我得到返回代码0,但是当看门狗调用它时,我得到了返回代码1。我在上面添加了调试打印输出片段基本上可以打印所有内容,但是我真的看不到问题出在哪里。在所有情况下,从脚本运行ps
命令时,在日志中看起来都是这样的:
$ ps -p 1
PID TTY TIME CMD
1 ? 01:06:36 systemd
唯一的区别是返回值不同。我用以下代码检查了退出代码:
/bin/ps -p ${PID}
echo $? >> myprog.log
这可能是什么原因?为什么返回代码根据我如何调用脚本而有所不同?我试图下载ps
的源代码,但对我来说,这太复杂了。
我能够通过一个丑陋的“解决”问题。我用管道输送ps -p $PID | wc -l
并检查行数至少为2,但这听起来像是一个丑陋的黑客,我真的很想了解这里的问题。
在下面发表评论
原始脚本包含绝对路径,因此这不是目录问题。 ps
没有别名。 which ps
产生/bin/ps
。这些脚本以root用户身份运行,因此我看不到它可能是一个权限问题。