问题描述
如何在 Windows、Darwin 和 Linux 中按进程名称杀死进程? 比如,假设我需要杀死的进程是“vlc.exe”(基本上关闭应用程序)。
这里是我写的函数,用来检查这个进程是否正在运行。
const isRunning = (query,cb) => {
let platform = process.platform;
let cmd = '';
switch (platform) {
case 'win32': cmd = `tasklist`; break;
case 'darwin': cmd = `ps -ax | grep ${query}`; break;
case 'linux': cmd = `ps -A`; break;
default: break;
}
exec(cmd,(err,stdout,stderr) => {
stdout = stdout.toLowerCase().replace(/\s/g,'');
cb({status: stdout.indexOf(query.toLowerCase()) > -1});
});
}
我称这个函数为
isRunning('vlc.exe',(vlc) => {
console.log({ vlc }); // true|false
});
所以,我知道 VLC 是否正在运行。现在我想关闭它,如果它正在运行。 对于 Windows,它的 taskkill 但对于 darwin 和 Linux?或者有没有其他方法可以杀死进程?
解决方法
PID 在 ps
输出中。如果 pidof
可用,您可以执行 kill $(pidof vlc)
。您也可以将 a well-tested module 用于相同的目的,而不是编写自己的代码来找出 PID 并进行杀戮。
在 macOS 上,很可能也在 linux 上。进程名称是 VLC
。系统区分大小写,因此查找 vlc.exe
或 vlc
将找不到任何正在运行的进程。
你可以通过做类似的事情来玩
kill $(ps aux | grep -i 'vlc' | awk '{print $2}')
哪个会
-
ps aux
- 查找所有进程 -
grep -i 'vlc'
通过捕获名称为VLC
或vlc
的进程来过滤掉 ps(想想强制不区分大小写的 -i 参数)。 -
awk '{print $2}'
仅捕获 PID 编号。 -
kill
要求系统根据给定的 PID 正常停止进程。