Ubuntu 18.04を終了/再起動したときにコマンドを実行する

Ubuntu 18.04を終了/再起動したときにコマンドを実行する

[私の構成] Ubuntu 18.04 - digitalocean Droplet/Server

[背景]私の研究によると、/etc/network/intefacesは18.04から使用されなくなり、netplanというものが導入されたと推測されます。デスクトップはNetworkManagerを使用し、サーバーNetplanは制御をsystemd-networkdに渡します。

[質問] 終了/再起動時に実行するスクリプトを取得します。 /etc/network/interfacesでpre-up/post-downを使用しようとしましたが、上記の理由で機能しません。

特に、私が実行したいスクリプトは、シャットダウンと再起動時にiptablesを保存して復元することに関連しています。

[iptables-percious] iptables-perciousをインストールするように依頼しないでください。これは、iptablesをバッファなどの別々のファイルに保存して復元する必要があるためです。 iptables-persistがファイルを別の場所に保存し、再起動時にロードできる場合を考えてみましょう。

どんなアイデアがありますか?

[努力しました]

  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.programchrootの読み書き)このように:

#!/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を有効にする<サービス名>.service

私はデフォルトのインストールを使ってUbuntu 16.04と18.04でサービスファイルを試しましたが、すべてがうまくいくようです。

関連情報