[私の構成] 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がファイルを別の場所に保存し、再起動時にロードできる場合を考えてみましょう。
どんなアイデアがありますか?
[努力しました]
結果なしで/etc/NetworkManager/dispatcher.d/01firewallに実行可能ファイルを作成しました。上記のように、サーバーのインストール時にNetworkManagerを使用しないためですか?
/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を有効にする<サービス名>.service
私はデフォルトのインストールを使ってUbuntu 16.04と18.04でサービスファイルを試しましたが、すべてがうまくいくようです。