在关闭/重新启动 Ubuntu 18.04 时运行命令

在关闭/重新启动 Ubuntu 18.04 时运行命令

[我的配置] Ubuntu 18.04 - digitalocean Droplet/服务器

[背景] 根据我的研究,我推测自 18.04 起 /etc/network/intefaces 已被弃用,并引入了名为 netplan 的东西。桌面使用 NetworkManager,而服务器 Netplan 将控制权交给 systemd-networkd。

[问题] 获取在关闭/重新启动时运行的脚本。我计划在 /etc/network/interfaces 中使用 pre-up/post-down,但由于上述原因,这对我不起作用。

具体来说,我想要运行的脚本与关闭和重新启动时保存和恢复 iptables 有关。

[iptables-persistent] 请不要要求我安装 iptables-persistent,因为即使在这种情况下,我仍然需要将 iptables 保存和恢复到单独的文件,例如缓冲区。如果 iptables-persistent 可以以某种方式将其文件保存在不同的位置并在重新启动时加载该文件,我会考虑它。

有任何想法吗?

[我试过]

  1. 我在 /etc/NetworkManager/dispatcher.d/01firewall 中创建了一个可执行文件没有结果。这是因为如上所述,服务器安装中未使用 NetworkManager 吗?

  2. 我在 /lib/systemd/system/ 中创建了一个服务:

    [Unit]
    Description=ipres
    
    [Service]
    ExecStart=/bin/sh -c '/sbin/iptables-save -c > /etc/blah/firewall/up.save'
    ExecStop=/bin/sh -c '/sbin/iptables-save -c > /etc/blah/firewall/down.save'
    
    [Install]
    WantedBy=multi-user.target
    

    部分成功,因为文件已创建但为空(是否因为 iptables-save 运行太晚/太早?)

答案1

最后我在文件中使用了这个服务定义/etc/systemd/system/ipres.service

[Unit]
  Description=ipres
  Wants=network-online.target
  After=network.target auditd.service
  ConditionPathExists=/etc/mypath

[Service]
  Type=oneshot
  RemainAfterExit=yes
  ExecStart=/usr/local/bin/my.program load
  ExecStop=/usr/local/bin/my.program save

[Install]
  WantedBy=basic.target

并使用了 my.program /usr/local/bin/my.program(chroot 读写)像这样:

#!/bin/sh

    case $1 in
    load)
        #Do some stuff
    ;;
    save)
        #Do some stuff
    ;;
    *)
        echo "Invalid action '$1'"
    ;;
    esac

不要忘记启动并启用您的服务。

systemctl enable ipres.service && systemctl start ipres.service

非常适合我。

答案2

该命令是否在您的服务器上手动运行以及您是否使用以下命令启用了该服务:

systemctl enable <您的服务名称>.service

我已经在 ubuntu 16.04 和 18.04 上使用默认安装尝试了你的服务文件,一切似乎都正常;)

相关内容