我启动了一个无法运行的应用程序,但我无法删除它,因为它仍在运行。我可以打印 PID,但不能使用它终止进程。
~ $ ps ax | grep snappr | awk '{print $1}'
70824
~ $ kill $(ps ax | grep snappr | awk '{print $1}')
-bash: kill: (70832) - No such process
Run Code Online (Sandbox Code Playgroud)
Sco*_*ott 17
您是否注意到在两次尝试中获得了两个不同的 PID?
考虑一下:如果您键入类似 的命令vi raven.txt
,ps ax
则将显示一行显示 的命令vi raven.txt
。同样,如果您键入类似 的命令grep snappr
,ps ax
则将显示一行显示 的命令grep snappr
。并且,如果您将其输出ps
通过管道传输grep snappr
,grep
则将找到描述自身的行。所以,如果你输入
$ ps ax | grep snappr | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)
重复,它每次都会打印不同的数字(因为它正在打印 的 PID grep
,并且grep
每次运行命令时都会得到一个新的、唯一的进程)。
最后,请考虑:在kill
知道其参数之前无法执行该命令。要知道其参数,$(ps ax | grep snappr | awk '{print $1}')
管道必须已完成。这意味着grep
必须已终止1。因此,kill
正在给定grep
进程的 PID ,但只有在grep
进程终止之后——所以,自然地,它报告“没有这样的进程”。
也许我应该提到没有snappr
进程在运行。如果有,您的第一个命令将输出两个数字: 的 PIDsnappr
和 的 PID grep snappr
。现在,如果snappr
正在运行,您的命令可能会开始半正确地运行,我的意思是它可以执行您想要的操作,但也会给出错误消息。如果snappr
以 PID 42097grep snappr
运行,并以 PID 70848 运行,则kill
命令将是kill 42097 70858
,这将终止 并通过尝试终止不再存在snappr
的grep
进程而获得错误消息。
你可能想要改进这一点。我最喜欢的方式,我在 20 年前发明的,它改变grep
到grep "[s]nappr"
,它会匹配snappr
但不会匹配自身。另一种方法是使用pgrep
而不是ps | grep
.
1或者,awk
如果grep
仅关闭其标准输出,则可以完成。对于 *nix 程序来说,这将是非常不寻常的行为。
不要通过猛砸跳火圈杀snappr
同ps
,通过管道grep
,然后通过管道awk
这样的。而是尝试使用pkill
;像这样杀死它。没有麻烦或大惊小怪,它的目标基于开箱即用的进程名称:
sudo pkill snappr
Run Code Online (Sandbox Code Playgroud)
不太清楚Snapper如何在系统进程级别上运行,但问题可能是您只获取子进程 ID 而不是父进程 ID。
事实上,我相信您用来获取进程 ID ( ps ax | grep snappr | awk '{print $1}'
) 的方法将返回连接到的整个进程 ID 列表snappr
,无论它是父进程还是子进程。因此,使用它您可能会杀死一个只是子进程 ID 的进程 ID,但父 ID 仍将处于活动状态并能够“生成”另一个子进程来进行补偿。
所以也许你可以做这样的事情来获取你提供给它的任何进程 ID 的最终父 ID 并对其采取行动;它如何工作的简单概念证明:
ps -p [process ID] -o ppid=
Run Code Online (Sandbox Code Playgroud)
在 Bash 中运行该裸命令将为您提供您放入的子进程 ID 的父进程 ID [process ID]
。因此,如果子 ID4567
的父进程 ID 为,123
则命令将是:
ps -p 4567 -o ppid=
Run Code Online (Sandbox Code Playgroud)
这将返回,123
。
也就是说,这可能是一种处理流浪进程的危险方式,因为如果您的脚本获取了 的实际父进程 ID snapper
,那么该进程 ID 的父进程实际上可能是您自己的 Bash shell。因此,您可能会无意中杀死 Bash shell,而不是snapper
在让snapper
进程运行的同时将您从系统中删除。
话虽如此,为什么不让你的生活更轻松,pkill
像这样运行:
sudo pkill snappr
Run Code Online (Sandbox Code Playgroud)
这将杀死所有连接的进程,snappr
而无需任何花哨的命令行杂耍。
归档时间: |
|
查看次数: |
10931 次 |
最近记录: |