開始および終了時にzfsデータ・セットをロールバックするスクリプトを呼び出すシステム・サービス・ファイルを作成しようとしています。先頭はうまく機能しますが、シャットダウン中にカーネルパニックが発生し続けます。
zfsがロールバックを完了する前に、systemdが重要なタスクを終了していると思います。
誰でもどんな提案がありますか?これは私の現在のサービスファイルです。
[Unit]
Description=Public Rollback Service
After=zfs.target
Requires=zfs.target
[Service]
Type=oneshot
ExecStart=/bin/sh /usr/local/bin/public_rollback.sh
RemainAfterExit=True
ExecStop=/bin/sh /usr/local/bin/public_rollback.sh
[Install]
WantedBy=multi-user.target
呼び出されるスクリプトは次のとおりです。
#!/bin/sh
if zfs rollback $(zfs list -H -o name -t snapshot -r tank/public | tail -1); then
exit 0
else
echo "Could not rollback public dataset! Aborting." 1>&2
exit 1
fi
答え1
だから問題が何であるかについて私が間違っているようです。ログを確認した後、データセットはまだ忙しい状態でロールバックしようとしました(とにかくログアウトプロセスが完了したとします)。
ロールバックの準備に時間を費やすために、デフォルトのExecStopコマンドの前に追加のコマンドを追加しましたが、ExecStop=/bin/sleep 1
それ以降は問題は発生しませんでした。
答え2
2 つのサービスを使用することもできます。 1つは開始用で、もう1つは終了用です。開始に必要なものExecStop
(ガイドラインを除く) 次のように終了する前にスクリプトを起動します。
[Unit]
Description=Public Rollback Shutdown Service
DefaultDependencies=no
Before=halt.target shutdown.target reboot.target
[Service]
Type=oneshot
ExecStart=/bin/sh /usr/local/bin/public_rollback.sh
[Install]
WantedBy=halt.target shutdown.target reboot.target