写给linux系统管理员看的systemd 四 杀掉服务(systemd作者blog翻译过来的)
原文地址:http://0pointer.de/blog/projects/systemd-for-admins-4.htmlKilling ServicesKilling a system daemon is easy, right? Or is it?Sure, as long as your daemon persists only of a single process
原文地址:http://0pointer.de/blog/projects/systemd-for-admins-4.html
杀掉服务
杀掉一个系统的守护进程挺容易的,是吗?真的吗?
如果你的守护进程就有一个单个进程,杀掉它是挺容易的。你键入killall rsyslogd,然后syslog守护进程远去了。然而这种方法有点脏:它杀死所有以syslog命名的进程,包括某个倒霉用户碰巧用户名叫syslog。好点的方法是读.pid文件,像这样kill `cat /var/run/syslogd.pid`。前进了一步,但这真是我们要的吗?
更多情况下它不是我们想要的。考虑下像Aapche,crond,或者atd这样的服务,它们的一项操作就是产生子进程。用户任意配置子进程,比如cron,或者作业,甚至整个的应用服务器。如果你杀掉apache/crond/atd/进程,也许子进程并不会退出,这就意味着终止Aapche很可能引起CGI脚本仍在运行,PID变成init,跟踪这样的进程是很困难的。
systmed来拯救世界了:用systemctl kill命令你能轻松加愉快的给服务的所有进程发信号。例如:
# systemctl kill crond.service
这确保SIGTERM传递给crond服务的所有进程,而非仅仅是主进程。当然,你可根据需要发送不同的信号:
# systemctl kill -s SIGKILL crond.service
如你所愿,敌方服务所有进程团灭,不管它fork了多少次。
有时你想要的就是发个特定信号给服务主进程,也许你想通过SIGHUP触发reload。不使用PID文件,可以这样轻易做到:
# systemctl kill -s HUP --kill-who=main crond.service
systemd中杀死服务有什么新颖的东西呢?好吧,这是Linux中我们首次有正确的方法来做这件事。前面的解决方案总是依赖于守护进程的配合:当它们自己终止时,它们终止所有它们产生的进程。有时你会想用SIGTERM或者SIGKILL,因为守护进程有时不能和你合作愉快。
这种方法和systemctl stop有啥关系呢?kill直接发送信号给组中的所有进程,stop走官方配置渠道去关闭服务,比如调用在服务文件中的ExecStop=项。通常stop就足够了。kill是暴力版,只有在你不想用服务的官方渠道关闭命令,或者其他方法不起作用的时候,才启用它。
(-s 开关的参数加不加SIG前缀都行)
有点奇怪Linux这么长时间了都不能正确的杀死服务,systemd是首次让你能正确的做这件事的东东。
更多推荐
所有评论(0)