zfs ロールバックが完了するまで systemd を待機する方法

zfs ロールバックが完了するまで systemd を待機する方法

開始および終了時に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 

関連情報