0

下面我试图提取pid一个正在运行的进程来检查它的当前ppid

ps -p 1111 -o ppid = $(ps -eo pid,args | awk '/PRD_/ && /startscen\.sh/ && $8 ~ /<string>/' | awk -F" " '{print $1}')

我的脚本是错误的。有没有更好的办法?

4

2 回答 2

0

ps -ef |  awk '/PRD_/ && /startscen\.sh/ {print $3}'

给你你想要的?在 CMD 字符串中搜索带有“PRD_”和“startscen.sh”的进程,并报告 PPID。如果您想运行额外的 ps 以获取有关父级的信息,

ps -p `ps -ef |  awk '/PRD_/ && /startscen\.sh/ {print $3}'`
于 2013-10-22T14:48:27.447 回答
0

要检查特定进程的 ppid,请使用如下符号:

$ ps -p 1111 -o ppid=

这与您所得到的很接近,但请注意等号紧跟在 之后 ppid,没有空格。这个等号不是表达式的一部分,它的功能-o是指定自定义标题。在我包含的这个示例中,您告诉 ps 根本不包含任何标题,因此输出将只是 ppid 而不是其他内容。例如,尝试ps -p 1 -o ppid=Hello.

如果我没看错,那么您的示例代码的其余部分似乎与您的实际问题无关,而是试图收集可能正在运行的 shell 脚本的 pid。所以......作为这个答案的附录,我在这一点上的建议是修改shell脚本,以便它在某处记录自己的,所以你不必依赖解析进程表来找到它。例如,您可以在顶部附近添加startscen.sh如下所示的内容:

pidfile="/var/run/`basename $0`.pid"
if [ -s "$pidfile" ]; then
    if ps "$(cat $pidfile)" >/dev/null; then
        echo "ERROR: already running, giving up." >&2
        exit 1
    fi
fi
trap "rm -f pidfile" 0 1 2 3 5 15
echo $$ > $pidfile

它并不完美,但这将为您提供一些防止同时运行脚本两次的保护,并将正在运行的脚本的 pid 存储在其他 pid 所在的文件中。

于 2013-10-23T00:40:53.703 回答