【发布时间】:2020-12-30 12:45:28
【问题描述】:
我需要帮助解决以下问题: 我想杀死一个程序的所有实例,比如说 xpdf。 在提示符下,以下工作按预期工作:
$ ps -e | grep xpdf | sed -n -e "s/^[^0-9]*\([0-9]*\)[^0-9]\{1,\}.*$/\1/p" | xargs kill -SIGTERM
(需要 sed 步骤来提取 PID)。
但是,可能存在没有运行 xpdf 进程的情况。然后很难将该行嵌入到脚本中,因为它会在它之后立即中止,并带有来自 kill 的消息。我该怎么办?
我尝试过(在脚本中)
#!/bin/bash
#
set -x
test=""
echo "test = < $test >"
test=`ps -e | grep xpdf | sed -n -e "s/^[^0-9]*\([0-9]*\)[^0-9]\{1,\}.*$/\1/p"`
echo "test = < $test >"
if [ -z "$test" ]; then echo "xpdf läuft nicht";
else echo "$test" | xargs -d" " kill -SIGTERM
fi
运行上面的脚本时,我得到了
$ Kill_ps
+ test=
+ echo 'test = < >'
test = < >
++ ps -e
++ grep xpdf
++ sed -n -e 's/^[^0-9]*\([0-9]*\)[^0-9]\{1,\}.*$/\1/p'
+ test='21538
24654
24804
24805'
+ echo 'test = < 21538
24654
24804
24805 >'
test = < 21538
24654
24804
24805 >
+ '[' -z '21538
24654
24804
24805' ']'
+ xargs '-d ' kill -SIGTERM
+ echo '21538
24654
24804
24805'
kill: failed to parse argument: '21538
24654
24804
24805
一些意外发生:在测试中,PID 比进程多
在提示符处:
$ ps -e | grep xpd
21538 pts/3 00:00:00 xpdf.real
24654 pts/2 00:00:00 xpdf.real
再次运行脚本时,24* PID 发生变化。
所以这是我的问题:
- 额外的 PID 来自哪里?
- 如果没有我想杀死的进程正在运行(或者为什么 xargs 不接受
echo "$test"作为输入),我可以做些什么来处理这种情况? (我希望我的脚本不会被中止)
提前致谢。
【问题讨论】:
-
另外一个 pid 来自您的
grep命令,它的术语为xpdf。如果您使用xargs -n 1 kill -TERM,您的脚本将起作用(不是最佳的)。