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

ste*_*nmm 1 linux kill remote process

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

Gil*_*il' 7

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

没有标准的守护进程可以帮助你。他们都会处理您的身份验证,然后派生一个像您一样运行的新进程(例如 shell)。因此,如果您没有控制台访问权限并且没有与机器的现有交互,那么您就不走运了。


从您的评论来看,您的机器上似乎还有一个外壳。然后你可以做一些事情。您不能运行任何外部进程,例如lsps。但是你可以运行内置的诸如命令echoread以及killkill是不是内置在所有的炮弹,但它是一个在所有的炮弹支持作业控制,如bash和zsh中)。

每个进程在/proc:/proc/12345下都有一个关联目录,其中 12345 是进程 ID。因此,您可以通过探索获得一些有关 exising 的信息/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
Run Code Online (Sandbox Code Playgroud)

您可以通过将它们全部传递给kill. 如果您已经确定了属于你的守护进程,试图杀死它的进程组kill -9 -PGID,其中PGID为组长的进程ID。您可以使用 找到进程 123 的进程组 ID </proc/123/stat read pid tcomm state ppid pgrp sid more; echo $pgrp。(相同的信息以更易读的形式存在,/proc/123/但您的阅读条件不佳。)您还可以尝试使用以下命令向所有进程(包括原始 shell)发送信号

trap : NUM
kill -NUM -1
Run Code Online (Sandbox Code Playgroud)

选择除KILL(9)以外的 NUM 值,以便该trap命令确实导致您的 shell 忽略该信号(KILL不能被捕获)。