背景说明
本机环境:ubuntu16.04
需求:本机关机时调用远程服务用来记录日志等操作
systemd说明
ubuntu16.04采用的是systemd作为系统管理的子系统,关于systemd的更多说明,可以参看
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html
值得注意的是systemctl命令和journalctl命令实在是太好用了
详细
我们需要的是系统关机自动启动,这个时候有两种选择,假设我们的执行脚本是/usr/local/bin/cleanup.sh
- option1: 将执行脚本直接放在
/lib/systemd/system-shutdown/
目录下 - option2: 在
/lib/systemd/system/
目录下添加cleanup.service
这样一个systemd的配置文件,去调用cleanup.sh
根据说明 /lib/systemd/system-shutdown/
目录下的脚本的执行时机会非常靠后,文件系统已经挂载只读,网络服务可能也已经关闭,仅仅在系统halt之前。所以这个时候执行很多任务都是受限的。这样的话,我们选择option2来完成我们的任务
所以我们新建 /lib/systemd/system/cleanup.service
如下
[Unit]
Description=Run command at shutdown
Requires=network.target
DefaultDependencies=no
Conflicts=reboot.target
Before=shutdown.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/bin/bash /usr/local/bin/cleanup.sh
[Install]
WantedBy=multi-user.target
解释一下,由于其DefaultDependencies=no
,这个脚本开机就会启动(enable之后),脚本在启动的时候调用/bin/true
什么也不做 ,然后在系统调用shutdown.target的时候,会执行退出操作,就是我们希望的运行脚本/bin/bash /usr/local/bin/cleanup.sh
。也就达到了我们希望的效果。
然后重新加载systemd配置
sudo systemctl daemon-reload
链接service以使其开启启动
sudo systemctl enable cleanup.service
本次不关机手动启动service(当然如果你重启电脑了当然就不需要这一步了,会自动启动)
sudo systemctl start cleanup.service
这个时候sudo poweroff
应该就能正确的执行你的叫脚本了
ps:如果有问题,可以通过journalctl命令查看哦
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)