通过 SSH 以 root 身份运行以下命令 (bash) 后:
pkill --help
pkill -h
pkill /?
前两个命令没有给我提供任何信息,这就是为什么运行第三个命令(有点本能......)。
接下来发生的事情是,我与服务器的 SSH 会话关闭了,并且无法重新连接。我猜它停止了所有(或大多数)正在运行的进程,包括负责此类会话的守护进程。
我想了解为什么发生了什么:对我的输入的具体评估(一步一步)是什么,以及它导致了什么。
我最好的猜测是,它与 shell 对 '?' 字符的评估有关,该评估可能转换为几个单字符表达式的列表,这些列表被传递给 pkill,然后 pkill 又关闭了这些 PID。
答案1
在 CentOS 5.2 上,运行提供的手册页man pkill
表明它将把 /? 解释为进程名称或命令行的扩展正则表达式。
因此 ? 表示前一个字符可能出现也可能不出现。由于只有一个其他字符,即 /,因此 pkill 会终止所有可以终止的进程。
在 Linux 系统上,请尝试记住 man 命令以首先获取文档。
答案2
跑步pgrep /?
...
这将返回与该 shell 模式匹配的进程的 PID。pkill
使用相同参数运行将终止pgrep /?
输出中列出的所有内容。
我认为您正在终止您自己的会话以及许多其他进程(在本例中是所有 PID)。
答案3
命令行表达式的语法/switch1 /switch2
是 Windows/DOS 的东西。在 Linux 以及我所知道的所有 UNIX 上,命令行参数语法是--switch -s
。/?
被认为是正则表达式。正则表达式/?
,至少就我从grep
的手册页中了解到的而言,将匹配 0 或 1。/
这似乎无法解释为什么这会终止 SSH,但它确实解释了发生了什么。