ubuntu设置关机时自动执行任务

背景说明

本机环境: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命令查看哦

你可能感兴趣的:(工具)