下面我试图提取pid
一个正在运行的进程来检查它的当前ppid
ps -p 1111 -o ppid = $(ps -eo pid,args | awk '/PRD_/ && /startscen\.sh/ && $8 ~ /<string>/' | awk -F" " '{print $1}')
我的脚本是错误的。有没有更好的办法?
做
ps -ef | awk '/PRD_/ && /startscen\.sh/ {print $3}'
给你你想要的?在 CMD 字符串中搜索带有“PRD_”和“startscen.sh”的进程,并报告 PPID。如果您想运行额外的 ps 以获取有关父级的信息,
ps -p `ps -ef | awk '/PRD_/ && /startscen\.sh/ {print $3}'`
要检查特定进程的 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 所在的文件中。