写给linux系统管理员看的systemd 四 杀掉服务(systemd作者blog翻译过来的)

5 篇文章 0 订阅
1 篇文章 0 订阅

原文地址: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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值