如何在 Linux 中查找并终止远程进程?

如何在 Linux 中查找并终止远程进程?

我正在开发一个正在运行的守护进程,现在无法创建任何新进程(即,我无法启动新进程来终止其他恶意进程)。因此,我需要能够从远程计算机终止进程。如何在没有管理员权限的情况下远程“终止”进程?如果我无法以普通用户身份从远程计算机终止自己的进程,请告诉我,以便我可以将其标记为正确答案。

答案1

为了终止机器上运行的进程,某个本地进程(或内核)必须发出终止信号。因此,您需要一种方法来使进程发出该信号,并且由于您无法创建新进程,因此您需要找到一种完全依赖于已运行进程的方法。

没有标准守护进程可以帮你解决这个问题。它们都会处理你的身份验证,然后派生出一个以你身份运行的新进程(例如 shell)。因此,如果你没有控制台访问权限,并且没有与机器进行任何交互,那你就没那么幸运了。


从您的评论来看,您的机器上似乎仍有一个 shell。然后您可以做一些事情。您无法运行任何外部进程,例如lsps。但您可以运行内置命令,例如echoreadkillkill不是所有 shell 中的内置命令,但它是所有支持作业控制的 shell 中的内置命令,例如 bash 和 zsh)。

/proc每个进程在:下都有一个关联目录,/proc/12345其中 12345 是进程 ID。因此,您可以通过探索 来获取有关存在的一些信息/procecho使用通配符在这里很有用,例如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节了解处理僵尸的正确方法。

相关内容