ps实际返回什么? (不同的值取决于调用方式)

时间:2019-06-04 11:34:55

标签: linux bash ps

我有一个包含此代码段的脚本:

#!/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用户身份运行,因此我看不到它可能是一个权限问题。

0 个答案:

没有答案