12
22
2016
9

利用 systemd 的 watchdog 功能重启卡住的服务

本文来自依云's Blog,转载请注明。

我在用 offlineimap。用着用着就发现一个问题:偶尔 offlineimap 会卡在网络上不动弹了。跟 getmail 一个德性……

但是 offlineimap 又跟 getmail 有点不一样,它是持续运行着的。虽然非要把之前那个 killhung 程序拿来用不是不可以,但我还是重新弄了一个更优雅的方案:systemd watchdog。

我的 offlineimap 本来就是用 systemd 服务的方式来跑的,所以很适合这样的改造呢。只是,当我瞅了一眼源码之后,我就放弃了 patch offlineimap 的打算。很难在合适的地方添加 watchdog 相关的代码。

既然从内部着手不好做,那就从外部写一个 wrapper 好了,反正 offlineimap 跟 getmail 不一样,正常情况下一直在输出东西,就把这个作为它的「心跳」特征好了。当然这个 wrapper 还可以给其它程序用。

于是,watchoutput 程序诞生了!稍微改一下 offlineimap 的 .service 文件,像这样子就好了:

[Unit]
Description=Offlineimap Service

[Service]
Type=notify
ExecStart=.../watchoutput /usr/bin/offlineimap
TimeoutStopSec=3s
SyslogIdentifier=offlineimap
Restart=on-failure
WatchdogSec=70
LimitCORE=0

[Install]
WantedBy=default.target

加上LimitCORE=0是为了阻止重启的时候由于 SIGABRT 信号导致 coredump,浪费磁盘空间。

用了几天之后,终于观察到一次由 watchdog 触发的重启:

12月 19 12:26:53 lilywork offlineimap[21623]:  Establishing connection to imap.exmail.qq.com:993 (main-remote)
12月 19 12:28:03 lilywork systemd[687]: offlineimap.service: Watchdog timeout (limit 1min 10s)!
12月 19 12:28:03 lilywork systemd[687]: offlineimap.service: Killing process 21623 (python3) with signal SIGABRT.
12月 19 12:28:03 lilywork systemd[687]: offlineimap.service: Killing process 21625 (offlineimap) with signal SIGABRT.
12月 19 12:28:03 lilywork systemd[687]: offlineimap.service: Main process exited, code=dumped, status=6/ABRT
12月 19 12:28:03 lilywork systemd[687]: offlineimap.service: Unit entered failed state.
12月 19 12:28:03 lilywork systemd[687]: offlineimap.service: Failed with result 'core-dump'.
12月 19 12:28:03 lilywork systemd[687]: offlineimap.service: Service hold-off time over, scheduling restart.
12月 19 12:28:03 lilywork systemd[687]: Stopped Offlineimap Service.
12月 19 12:28:03 lilywork systemd[687]: Starting Offlineimap Service...
12月 19 12:28:04 lilywork systemd[687]: Started Offlineimap Service.

没过几天,我又给这个 watchoutput 的脚本找到另外的用处:自动重启网络。

我家里的笔记本连 Wi-Fi 不知怎么,这些天经常会卡住(只发不收,一直处于 ARP 找网关的状态)。内核之前报过一次错,现在也没反应了。

于是:

[Unit]
Description=Watch for network availability

[Service]
Type=notify
ExecStart=.../watchoutput --retry-on-exit 2 --wait-before-retry 30 --ignore-stderr \
    -- ping -i 30 192.168.1.1
Restart=on-failure
WatchdogSec=70
StandardOutput=null
StandardError=journal
LimitCORE=0
SyslogIdentifier=watch-network

[Install]
WantedBy=default.target

拿 watchoutput 监控 ping 网关的输出,每30秒 ping 一次,如果70秒还没反应就重启它自己。然后我们还需要重新连接网络。在 /etc/systemd/system 下建立 netctl-auto@wlan0.service.d 目录,并在其下建立一个 watchdog.conf 文件,给 netctl-auto@wlan0.service 服务增加一项配置:

[Unit]
PartOf=watch-network.service

这样当 watch-network.service 重启的时候,netctl-auto@wlan0.service 就会自动重启了~

Category: Linux | Tags: linux systemd | Read Count: 8312
SpicyCat 说:
Dec 22, 2016 06:40:22 PM

重启网络这个学习了,笔记本睡眠唤醒后,网络总是断开的。
offlineimap 你是用 daemon 模式吗?我没有用它自己的 daemon 模式,做了个 timer 5分钟运行一次。
另外,不知道你用过 mbsync/isync 没。如果是Gmail的话, mbsync 比 offlineimap 又快又稳定。
但是 mbsync 无法同步163,qq, outlook邮箱,不知道为啥。这仨邮箱我还是用 offlineimap

Avatar_small
依云 说:
Dec 22, 2016 09:03:24 PM

好像是 daemon 模式呢。很早之前配置的,不太记得了。

我用 offlineimap 步是腾讯企业邮箱。

x u b o y i n g 说:
Jan 14, 2017 08:19:26 PM

这个partof 用的好精髓,ping的思路也很好

相当有意思的systemd例子,改吧改吧可以整一个用户面的路由协议。

FiveYellowMice 说:
Mar 10, 2017 10:20:19 AM

systemd 千秋万代,一桶浆糊!

温习江湖 说:
Mar 17, 2017 11:16:35 AM

前段时间干了类似的事情,结果……
两天后,不识别网卡了

zsrkmyn 说:
Jun 11, 2017 10:31:52 PM

咦,我的这里 offlineimap 一直不能收 126/163 的邮件……

Avatar_small
依云 说:
Jun 12, 2017 11:37:37 AM

网易不是早就关停了 POP3 / IMAP / SMTP 等服务了么?除了它自己那个什么鬼大师之外都不好用了吧。而且还要手机号。

SpicyCat 说:
Jun 12, 2017 11:51:09 AM

不会吧?我这里一切正常。网易邮箱用非官方客户端收邮件的话,不是用密码,而是一个安全码,你在网页版邮箱的设置页面找找看。

Avatar_small
依云 说:
Jun 12, 2017 03:13:49 PM

你交出了手机号?


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

部分静态文件存储由又拍云存储提供。 | Theme: Aeros 2.0 by TheBuckmaker.com