![如何在 Linux 中查找并终止远程进程?](https://linux22.com/image/1254911/%E5%A6%82%E4%BD%95%E5%9C%A8%20Linux%20%E4%B8%AD%E6%9F%A5%E6%89%BE%E5%B9%B6%E7%BB%88%E6%AD%A2%E8%BF%9C%E7%A8%8B%E8%BF%9B%E7%A8%8B%EF%BC%9F.png)
我正在开发一个正在运行的守护进程,现在无法创建任何新进程(即,我无法启动新进程来终止其他恶意进程)。因此,我需要能够从远程计算机终止进程。如何在没有管理员权限的情况下远程“终止”进程?如果我无法以普通用户身份从远程计算机终止自己的进程,请告诉我,以便我可以将其标记为正确答案。
答案1
为了终止机器上运行的进程,某个本地进程(或内核)必须发出终止信号。因此,您需要一种方法来使进程发出该信号,并且由于您无法创建新进程,因此您需要找到一种完全依赖于已运行进程的方法。
没有标准守护进程可以帮你解决这个问题。它们都会处理你的身份验证,然后派生出一个以你身份运行的新进程(例如 shell)。因此,如果你没有控制台访问权限,并且没有与机器进行任何交互,那你就没那么幸运了。
从您的评论来看,您的机器上似乎仍有一个 shell。然后您可以做一些事情。您无法运行任何外部进程,例如ls
或ps
。但您可以运行内置命令,例如echo
、read
和kill
(kill
不是所有 shell 中的内置命令,但它是所有支持作业控制的 shell 中的内置命令,例如 bash 和 zsh)。
/proc
每个进程在:下都有一个关联目录,/proc/12345
其中 12345 是进程 ID。因此,您可以通过探索 来获取有关存在的一些信息/proc
。echo
使用通配符在这里很有用,例如cd /proc; echo [0-9]*
显示所有正在运行的进程的进程 ID。如果 shell 是 zsh,您可以使用 glob 限定符做很多事情;例如,echo /proc/*(u$UID)
仅显示在您的用户 ID 下运行的进程。
无需分叉即可显示文件内容的一种方法
while read -r line; do
echo "$line"
done </path/to/file
您可以通过将所有进程传递给 来一次性终止多个进程kill
。如果您已确定属于守护进程的进程,请尝试使用 终止其进程组,其中组长进程 ID 为。您可以使用 找到进程 123 的进程组 ID kill -9 -PGID
。(相同的信息以更易读的形式存在于 中,但您无法很好地阅读它。)您还可以尝试使用 向所有进程(包括原始 shell)发送信号PGID
</proc/123/stat read pid tcomm state ppid pgrp sid more; echo $pgrp
/proc/123/
trap : NUM
kill -NUM -1
选择除KILL
(9) 之外的 NUM 值,以便trap
命令不会导致你的 shell 忽略信号(KILL
无法被捕获)。
答案2
以下信息来自http://www.cyberciti.biz/faq/kill-process-in-linux-or-terminate-a-process-in-unix-or-linux-systems/
在Linux/UNIX下使用kill命令杀死进程
kill 命令在 Linux 和 UNIX/BSD 类操作系统下均可运行。
步骤#1:首先,你需要找出进程PID(进程ID)
使用 ps 命令或 pidof 命令找出进程 ID (PID)。语法:ps aux | grep processname pidof processname
例如,如果进程名称是lighttpd,则可以使用以下任一命令来获取进程ID:
ps aux | grep lighttpdOutput
lighttpd 3486 0.0 0.1 4248 1432 ? S Jul31 0:00 /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
lighttpd 3492 0.0 0.5 13752 3936 ? Ss Jul31 0:00 /usr/bin/php5-cg
或者使用 pidof 命令来查找正在运行的程序的进程 ID:
pidof lighttpd
输出
3486
步骤#2:使用 PID(进程 ID)终止进程
上述命令会告诉您 lighttpd 进程的 PID(3486)。现在使用此 PID 终止进程:
# kill 3486
或者
# kill -9 3486
其中,-9是特殊的Kill信号,它将终止该进程。
killall 命令示例
不要在 UNIX 系统上使用 killall 命令(仅限 Linux 命令)。您也可以使用 killall 命令。killall 命令按名称终止进程(无需查找 PID):
# killall -9 lighttpd
终止 Firefox 进程:
# killall -9 firefox-bin
正如我之前所说,UNIX 系统上的 killall 会执行其他操作。它会终止所有进程,而不仅仅是特定进程。请勿在 UNIX 系统上使用 killall(使用 kill -9)。
答案3
正如您在评论中所说,管理员是目前唯一可以帮助您的人。我建议您获取Perl 手册并阅读16.19节了解处理僵尸的正确方法。