Bash 脚本自动关闭给定进程名称的进程

Bash 脚本自动关闭给定进程名称的进程

正如您可能从标题中猜到的那样,我正在尝试编写一个 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,而不是正在运行的进程lxtermxterminator本来会杀死的进程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会终止,您可以替换pkillpgrep -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 {} 杀死 {}

相关内容