linux - 这个蛋糕上的命令是做什么的?

标签 linux bash

为了庆祝我 3 个月的 Web 开发人员试用期结束,我要为办公室制作一个终端蛋糕。在研究该主题时,我看到了这张照片,想知道这些命令的作用是什么?

cake picture

最佳答案

该管道试图以相当严厉的方式停止系统上的所有 Apache 进程 Rube Goldbergian时尚。

管道:

  1. 获取系统上所有进程的列表。 (ps axww)

    这种方法有点过头了,它提供的数据多于实现预期目标实际所需的数据,这会在以后引起问题。

  2. 查找包含 httpd 的行,它是 Apache 网络服务器的常见进程名称。它可能会意外地匹配其他东西,但在一台应该只是网络服务器的机器上,它是相当安全的。

    在这个阶段你会得到这样的台词:

    17652 ?        Ss     0:00 /usr/bin/httpd -blah -args
    

    管道也会匹配 vi/etc/httpd/conf.d/mime.conf 命令。

  3. 过滤掉包含 grep (grep -v grep) 的行,因为第一个 grep 将还可以找到本身:

    24180 pts/0    R+     0:00 grep httpd
    

    如果您不过滤掉这一行,您可能会在管道完成之前终止第一个 grep 实例,从而破坏管道。 Linux 上的 ps 默认按 PID 对其输出进行排序,因此自 PIDs wrap around , grep 可能出现在 httpd 之前,导致 cake 命令实际上根本没有效果。

  4. 使用 xargs在找到的每一行上运行 kill -9

    也就是说,它构建这样的命令并运行它们:

    kill -9 17652 ?        Ss     0:00 /usr/bin/httpd -blah -args
    

    这可能会也可能不会如您所愿。它有时可以工作,因为当您使用axww 标志运行ps 时,进程ID (PID) 是行中的第一件事。 (还有其他运行 ps 的方法,其中第一行是其他内容。)蛋糕装饰者希望系统上的 kill 的实现不会当它在 ps 输出行上的 PID 之后获得所有其他垃圾时 barf。

    POSIX doesn't say kill(1) 对非 PID 参数做了什么。它可以在第一个非数字参数处停止,它可以为它找到的每个这样的参数给出错误,或者它可以默默地忽略它们。如果 ps 找到的行恰好包含有效 PID 的数字,蛋糕上的命令可能最终会终止您不希望它终止的进程。

使用pgrep会好很多在这里,如果可用的话:

# pgrep httpd | xargs kill -9

不仅命令更短,而且它可以可靠地执行您真正想要的操作。它不匹配然后过滤掉 grep 进程,它只匹配进程名称,它不会将非 PID 垃圾传递给 kill

带有 pgrep 的系统通常也有命令 pkill,它将管道打包成一个命令:

# pkill httpd

如果你愿意,你可以在这里添加-9来强行终止httpd进程,但我会从这里开始取消它。我已经命令这些命令变得越来越具有歧视性,所以如果您愿意的话,让它们变得越来越残酷也是有意义的。

如果您的系统没有pgreppkill,它可能有pidof。 :

# kill $(pidof httpd)

另一种方法是使用 killall :

# killall httpd

当心,killall 命令可能会执行 something different在非 Linux 操作系统上。

然而,最安全的方法是使用操作系统的常规“停止网络服务器”命令。示例:

# service httpd stop
# /etc/init.d/httpd stop
# systemctl stop httpd.service
# launchctl unload /System/Library/LaunchDaemons/org.apache.httpd.plist

Apache 包含一个“很好地停止 Apache”命令:

# apachectl stop

但是,该命令只会停止 Apache 本身。上面特定于操作系统的命令也可以执行其他清理操作。如果 Apache 是由操作系统启动的,您也应该使用操作系统自己的命令来停止它。

关于linux - 这个蛋糕上的命令是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23418822/

相关文章:

java - PHP 为 ls 命令返回问号

linux - curl 流输出逐行读取并包含条件

python - 从命令行运行已安装的 python 包

c++ - 通过linux终端将数据发送到另一个进程的stdin

sql - 从以 root 身份运行的 shell 脚本以 oracle 用户身份运行 oracle 脚本

java - Liferay Tomcat 与另一个 CMS 系统运行在同一个 Linux 机器上

linux - 如何检测将运行哪个程序?

bash:意外标记附近的语法错误

bash - printf %d 是添加而不是替换填充的零

linux - 在 Linux 中将第一行粘贴到每列后面