我知道在 Linux 上启动或停止 apache2 的正常方法是:
sudo /etc/init.d/apache2 start|stop
或者…
sudo service apache2 start|stop
或者…
sudo systemctl start|stop apache2
但是,在紧急情况下,我想使用“kill”命令停止进程。为此,我使用以下命令来停止 PID:
for pid in $(ps -ef | grep -i '[a]pache*' | awk '{print $2}'); do kill -9 $pid &> /dev/null; done
出去
user@user:~$ ps -ef | grep -i '[a]pache*'
root 173437 1 0 19:24 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 173438 173437 0 19:24 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 173439 173437 0 19:24 ? 00:00:00 /usr/sbin/apache2 -k start
user@user:~$ for pid in $(ps -ef | grep -i '[a]pache*' | awk '{print $2}'); do sudo kill -9 $pid &> /dev/null; done
user@user:~$ ps -ef | grep -i '[a]pache*'
root 174321 1 0 19:24 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 174322 174321 0 19:24 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 174323 174321 0 19:24 ? 00:00:00 /usr/sbin/apache2 -k start
... 新的 apache2 PID 出来了
这个命令有什么问题?
谢谢
PD:很久以前我在这个网站上找到了这个命令,但我不记得在哪里,因此我无法参考作者。对此我深表歉意
答案1
您提到systemctl stop apache2
,可能是因为您的 Apache 作为 systemd 服务启动。如果是这样,那么它重新启动的原因很可能是Restart=
在相关的服务单元配置文件中(apache2.service
)。
Restart=
配置当服务进程退出、被终止或超时时是否重新启动服务。[…]
no
取、on-success
、on-failure
、on-abnormal
、on-watchdog
、on-abort
或之一always
。如果设置为no
(默认),服务将不会重新启动。[…]
阅读手册以了解每个可能值的含义。或许你想要的Restart=no
。如果没有,不要错过这个片段:
作为上述设置的例外,如果在 […] 中指定了退出代码或信号,
RestartPreventExitStatus=
或者服务已停止systemctl stop
或执行了等效操作,则不会重新启动服务。此外,如果在 […] 中指定了退出代码或信号,则始终会重新启动服务RestartForceExitStatus=
。
如果你想使用例如,Restart=on-abort
仍然能够用SIGKILL(kill -s KILL
或kill -9
)杀死Apache,而不是让它复活,考虑放置
RestartPreventExitStatus=SIGKILL
在单位配置文件中。
注意 SIGKILL 应作为最后的手段使用。systemctl stop
应该是您的早期选择。我不知道您说的“紧急情况”是什么意思,但服务重新启动的事实让我相信 systemd 可以运行,而且很可能systemctl stop apache2
可以正常工作。