我只需要bash script_c.sh
从此输出中提取进程编号:
11545 pts/3 S+ 0:00 bash script_c.sh
11625 pts/3 S+ 0:00 grep script_c.sh
在这种情况下,它将是:11545
我努力了
PROCESS=$(ps ax | grep 'bash script_c.sh' | cut -d' ' -f1 | tr -d ' ' | sed '/^$/d')
之后我必须使用它来杀死它kill $PROCESS
,但是它不能很好地工作,它说:“必须是一个作业的 pid 等...”。
答案1
经典工具提取列是cut
。
pgrep -fl 'bash script_c.sh' | cut -f1 -d" "
将提取第一列,以单个空格字符分隔。它实际上应该会做你想要的事情。然而,更大的技巧是我使用了pgrep
,它具有更好的输出。如果我没有添加开关-l
,就不需要cut
:
pgrep -f 'bash script_c.sh'
然而,对于您的特定任务,您可能只想使用pkill
。
它允许通过某种模式终止进程,例如
pkill -f "script_c.sh"
最大的好处是pgrep
和pkill
有自我意识,只会输出/杀死匹配其他进程。在上面的例子中,您将得到诸如命令之类的误报grep
。因此,只需使用pkill
任何现代 Linux/BSD 系统上都可用的命令即可。
如果你真的想使用ps
(我不推荐):
ps ax | grep script_c.sh | grep -v grep | sed -e 's/^ *\([0-9]*\) .*/\1/'
或者使用 awk 效果更好(它更擅长自动解析 ps 的列布局):
ps ax | awk '!/awk/ && /script_c.sh/ { print $1 }'
请注意,对于这两者,您必须确保自己不进行匹配,即从匹配中排除 grep 和 awk。因此使用pgrep
会简单得多。pgrep
和pkill
都是解决您实际问题的正确工具。
答案2
尝试这个:
PROCESS=$(ps ax | grep 'bash script_c.sh' | sed 's/\([0-9]*\).*/\1/')