为了庆祝我作为网络开发者总结的3个月试用期,我将为办公室制作一个终端蛋糕.在我对这个主题的研究中,我看到了这张照片,并想知道这些命令是做什么的?
该管道尝试以相当严厉的Rube Goldbergian方式停止系统上的所有Apache进程.
管道:
获取系统上所有进程的列表.(ps axww
)
这种方法是一种过度扩展,提供的数据超过实现所需结束所需的实际数据,这将在以后引起问题.
查找包含的行httpd
,这是Apache Web服务器的常用进程名称.它可能会意外地匹配其他东西,但在一台本应该只是一个Web服务器的机器上,它是相当安全的.
在这个阶段你得到这样的行:
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
在管道完成之前终止第一个实例,从而破坏管道.ps
在Linux上的排序输出的PID默认情况下,这样以来的PID环绕,grep
可能出现前httpd
,导致蛋糕命令实际上没有任何效果可言.
用于xargs
kill -9
在找到的每一行上运行.
也就是说,它构建这样的命令并运行它们:
kill -9 17652 ? Ss 0:00 /usr/bin/httpd -blah -args
这可能会或可能不会做你想要的.它有时可以工作,因为当你ps
使用axww
标志运行时,进程ID(PID)是第一件事.(还有其他方法可以ps
在第一线上运行的地方运行.)蛋糕装饰器希望系统上的实现kill
不会在ps
输出线上的PID之后获得所有其他垃圾时进行barf .
POSIX没有说明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
命令可能会在非Linux操作系统上执行不同的操作.
但最安全的方法是使用操作系统的正常"停止Web服务器"命令.例子:
# 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正常运行.上面的OS特定命令也可以执行其他清理操作.如果Apache是由OS启动的,那么您也应该使用操作系统自己的命令来停止它.