終了する前に、マウントされたファイルシステムのsystemdサービスを実行して使用してください。

終了する前に、マウントされたファイルシステムのsystemdサービスを実行して使用してください。

私は苦労しました2日簡単でなければならないことを書きなさい。つまり、コンピュータがシャットダウンする前に実行されマウントされたファイルシステムと対話するワンタイムシステムサービスを作成します。

(RAMに「~/.mozilla」ディレクトリをマウントしておき、コンピュータのシャットダウン時にハードドライブに変更を保存しようとしています。)

私は太陽の下ですべてを試しましたが、何も機能しません。最善の試みは次のとおりです。

[Unit]
Description=Save Firefox and Thunderbird to the hard drive
DefaultDependencies=no
BindsTo=home-andy-.mozilla.mount
After=home-andy-.mozilla.mount
Before=halt.target poweroff.target reboot.target shutdown.target
Conflicts=umount.target

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/mozilla-save
TimeoutStartSec=infinity

[Install]
WantedBy=halt.target poweroff.target reboot.target shutdown.target

以下は、各ステートメントを追加した理由の説明です。

[Unit]
Before=halt.target poweroff.target reboot.target shutdown.target

[Install]
WantedBy=halt.target poweroff.target reboot.target shutdown.target

私のスクリプトは、コンピュータの電源が切れたときに実行する必要があるため、これを追加することです。これらのいずれかが他のすべてを意味するのか、それともすべて指定する必要があるのか​​は不明です。 「[インストール]」セクションにはすでにその情報が含まれているように見えるため、「古い」文が絶対に必要かどうかは不明です。

また、「umount.target」に関連するバリエーションを試しました。

[Unit]
DefaultDependencies=no

[Service]
TimeoutStartSec=infinity

これは、潜在的に長時間実行されるプロセスが数分後に積極的なシャットダウンプロセスによって終了するのを防ぐためです。

[Unit]
BindsTo=home-andy-.mozilla.mount
After=home-andy-.mozilla.mount
Conflicts=umount.target

私のプロセスはtmpfsファイルシステム( "/home/andy/.mozilla"にマウントされています)に依存しているので、これを追加します。プロセスの開始時にファイルシステムをマウントする必要があります。インストールされたままにする必要があります私のプロセスが完了するまで。シャットダウンプロセスは、ファイルシステムのマウント解除を含む多くのタスクを並列に実行します。

他の人の利益のために: "/ etc / fstab"ファイルでマウントポイントを宣言すると、自動的にsystemdで使用できます。必要な可能性のあるさまざまな取り付けポイントを一覧表示する方法は次のとおりです。

systemctl list-units --type=mount

これが私が今いるところです。私はこれについて数日過ごして疲れました。私はsystemdに疲れていて、助けが必要です。削りくれでも何でもよろしくお願いします。

記録によると、現在のファイルシステムが読み取り専用で再マウントされているため、 "/lib/systemd/system-shutdown/mozilla-save"のインストールスクリプトは機能しません。

これも機能しません。

Unit]
Description=Save Firefox and Thunderbird to the hard drive
BindsTo=home-andy-.mozilla.mount home.mount
After=home-andy-.mozilla.mount home.mount
Conflicts=umount.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/usr/local/sbin/mozilla-stop

[Install]
WantedBy=multi-user.target

...なぜかはわからないけど。

答え1

動作するサービスは次のとおりです。

[Unit]
Description=Save Firefox and Thunderbird to the hard drive
RequiresMountsFor=/home /home/andy/.mozilla

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/usr/local/sbin/mozilla-save
TimeoutSec=infinity

[Install]
WantedBy=multi-user.target

競合状態を確認するために、バックアップスクリプトの先頭に300秒のスリープモードを追加しました。シャットダウンプロセスが300秒間遅延した後、バックアップスクリプトは正常に実行されます。

これがついに機能する構成です。このソリューションが他の人に役立つことを願っています。

これがうまくいく理由の私の推測は次のとおりです。

私は信じる

[Service]
Type=oneshot
ExecStart=/bin/true

[Install]
WantedBy=multi-user.target

...マルチユーザー実行レベルが開始されると、「/bin/true」が実行されます。

これ自体は何もしません。しかし、次のように宣言してください。

[Service]
RemainAfterExit=true

...systemd が「/bin/true」だと思うようにします。まだ走っているマルチユーザーランレベルが終了したら(つまり、終了する前にすべてを解体します)。

この時点で、systemdはExecStopを呼び出して "/bin/true"プロセスを終了します。

ExecStop=/usr/local/sbin/mozilla-save

...マイバックアップスクリプトの実行代わりに

通常、systemdは長期実行のExecStopプロセスを終了するため、バックアップスクリプトを完了するのに十分な時間を費やす必要があります。

TimeoutSec=infinity

そして、systemdは他のすべてを同時にシャットダウンするので、バックアッププロセス中にファイルシステムをマウントして書き込み可能な状態に保つために必要です。

[Unit]
RequiresMountsFor=/home /home/andy/.mozilla

簡潔で読みやすい説明です。システムそしてユニットファイルデジタル海で。これは完全です。技術文書必要に応じて。

注:サービスの「[インストール]」部分を変更した場合〜しなければならないsystemctlに変更を通知します。これが私がする方法です:

systemctl disable mozilla-save
systemctl enable mozilla-save

...ここで "/lib/systemd/system/Mozillaを保存.service"は私のサービスの名前です。

これらのコマンドを使用すると、シンボリックリンクが追加または削除されます。これらのコマンドを呼び出さないと、テストは意味がありません。

関連情報