正如您可能从标题中猜到的那样,我正在尝试编写一个 bash 脚本来关闭给定程序名称的所有进程,但在这方面的经验几乎为零。我发现的是:
ps -aux | grep $processToClose
我可以获取具有该名称的所有进程,但要杀死它们,我只需手动使用:
kill -9 $processPID
关于如何自动化进程终止部分的任何想法?
(如果你想知道为什么我想做这样的事情:我在我的工作笔记本电脑和日常电脑上使用anydesk,所以我必须只使用一台,但有时(基本上每天)anydesk 选择不工作,所以我有使用我上面写的命令关闭它)
答案1
这就是pkill
目的。
pkill regexp
杀死(与 SIGTERM 类似的 with kill
,您通常不想使用 SIGKILL (9))名称(由ps
或报告ps -o comm
)与正则表达式匹配的进程。
pkill -f regexp
对于那些 arglist (假设他们或他们的祖先之一已执行命令)ps -f
(或ps -o comm
或您的 BSD 风格ps aux
)报告的与扩展正则表达式匹配的人。
添加-x
正则表达式的选项以匹配整个名称/参数列表。例如,这样pkill -x xterm
会杀死正在运行的进程xterm
,而不是正在运行的进程lxterm
或xterminator
本来会杀死的进程pkill xterm
。
因此,要终止名称存储在其中的进程$processToClose
,并假设$processToClose
不包含正则表达式运算符 ( \|$^*()+[]{}.?
):
pkill -x -- "$processToClose"
如果它包含或可能包含正则表达式运算符,则需要使用以下命令对其进行转义\
:
LC_ALL=C pkill -x -- "$(
printf '%s\n' "$processToClose" |
LC_ALL=C sed 's/[][\\|$^*()+{}.?]/\\&/g')"
这里还将两者的语言环境设置为 C pkill
,并sed
允许进程名称不一定在用户语言环境中形成有效文本。
要查看哪些进程pkill
会终止,您可以替换pkill
为pgrep -l
.
pgrep
/pkill
不是标准命令,但很常见。
ps
是标准的,但非常不便携。不同实现之间的选项列表和输出格式差异很大。特别是,您ps -aux
可能只会使用(通常在基于 Linux 的系统上发现的)procps
的实现。ps
这是 BSD 风格,但前面ps aux
有一个杂散。-
POSIX 指定的选项列表非常有限。
ps -A -o pid= -o comm= |
NAME=$processToClose awk '
NF == 2 && $2 "" == ENVIRON["NAME"] {print $1}' |
xargs kill
假设$processToClose
进程名称不包含空格将是标准方法。
答案2
ps -aux |grep $processName |awk '{print $2}'| xargs -I {} 杀死 {}