为了庆祝我 3 个月的 Web 开发人员试用期结束,我要为办公室制作一个终端蛋糕。在研究该主题时,我看到了这张照片,想知道这些命令的作用是什么?
最佳答案
该管道试图以相当严厉的方式停止系统上的所有 Apache 进程 Rube Goldbergian时尚。
管道:
获取系统上所有进程的列表。 (
ps axww
)这种方法有点过头了,它提供的数据多于实现预期目标实际所需的数据,这会在以后引起问题。
查找包含
httpd
的行,它是 Apache 网络服务器的常见进程名称。它可能会意外地匹配其他东西,但在一台应该只是网络服务器的机器上,它是相当安全的。在这个阶段你会得到这样的台词:
17652 ? Ss 0:00 /usr/bin/httpd -blah -args
管道也会匹配
vi/etc/httpd/conf.d/mime.conf
命令。过滤掉包含
grep
(grep -v grep
) 的行,因为第一个grep
将还可以找到本身:24180 pts/0 R+ 0:00 grep httpd
如果您不过滤掉这一行,您可能会在管道完成之前终止第一个
grep
实例,从而破坏管道。 Linux 上的ps
默认按 PID 对其输出进行排序,因此自 PIDs wrap around ,grep
可能出现在httpd
之前,导致 cake 命令实际上根本没有效果。使用
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
进程,但我会从这里开始取消它。我已经命令这些命令变得越来越具有歧视性,所以如果您愿意的话,让它们变得越来越残酷也是有意义的。
如果您的系统没有pgrep
或pkill
,它可能有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/