wil*_*ill 14 scripting process shell-script
我有两个脚本:
running_script
script_one
我需要获取在running_script
用户名下运行的/任何实例的 PID ,然后pkill
停止running_script
子进程。
我们期待这样的事情:
ps -fu will | grep running_script
Run Code Online (Sandbox Code Playgroud)
找到running_script
进程。但是,根据 ps 命令输出检查 PID 显示cmd为:running_script
进程的“bin/bash” 。
running_script
作为一个分离的进程(&
操作员)运行,它开始script_one
。我在开始时打印 PID-s 以与ps
命令的输出进行比较。
running_script &
echo $! -- $BASHPID
Run Code Online (Sandbox Code Playgroud)
在实际用例中,我们不会有某些running_script
正在运行的进程的PID 。此外,script_one
可能是也可能不是与running_script
父进程分离的进程。
为了练习的目的,script_one
只做循环。
while [ true ]
do
echo " $0 - 35sec ..."
sleep 35
done
Run Code Online (Sandbox Code Playgroud)
然而,这只是例子。要求是获取父running_script
进程的PID 。
是否有选项ps
或其他命令可以为我提供脚本文件的名称和 PID?或者设置一个可以搜索的名称的方法?
在最后一个用例中,可能有几个实例,running_script
因此按名称挑选它们似乎是迄今为止最好的选择。
我认为显示ps
命令显示的内容可能会有所帮助,因为大多数响应似乎都认为这会起作用。不久前我运行了这个例子。
$ ./running_script &
$ echo $! - $BASHPID
9047 - 3261
$ ps -ef | grep will
UID PID PPID C STIME TTY TIME CMD
will 8862 2823 0 22:48 ? 00:00:01 gnome-terminal
will 8868 8862 0 22:48 ? 00:00:00 gnome-pty-helper
will 8869 8862 0 22:48 pts/4 00:00:00 bash
* will 9047 3261 0 22:55 pts/2 00:00:00 /bin/bash
will 9049 9047 0 22:55 pts/2 00:00:00 /bin/bash
will 9059 2886 0 22:56 pts/0 00:00:00 man pgrep
will 9070 9059 0 22:56 pts/0 00:00:00 pager -s
will 10228 9049 0 23:31 pts/2 00:00:00 sleep 35
will 10232 8869 0 23:31 pts/4 00:00:00 ps -ef
will 10233 8869 0 23:31 pts/4 00:00:00 grep --colour=auto william
Run Code Online (Sandbox Code Playgroud)
我已经标记了 PID #9047,只是显示:- will 9047 3261 0 22:55 pts/2 00:00:00 /bin/bash
我可以在 linux 上设置类似“ jobname ”属性的东西吗?
ps -o pid,args -C bash | awk '/running_script/ { print $1 }'
这用于ps
获取所有 bash 进程的 pid 和 args,然后使用 awk 打印匹配进程的 pid(字段 1)。
顺便说一句,ps -o pid,args -C bash
为您提供所需的脚本文件的 pid 和名称 - 脚本的名称在bash
命令的 args 中。
如果您打算使用ps
而不是pgrep
至少使用其全部功能而不是非常丑陋的ps ... | grep -v grep | grep | awk
构造。grep
甚至不需要最后一个,因为awk
可以执行模式匹配。事实上,这两个 grep 都不需要,因为 awk 可以做到这一切:ps ax | awk '! /awk/ && /myprocessname/ { print $1}'