シャットダウン前にsystemdを使用してスクリプトを実行しますか?

シャットダウン前にsystemdを使用してスクリプトを実行しますか?

すべてのVirtualBoxシステムを一時停止するスクリプトを作成し、1行を追加しましたが/etc/rc.local.shutdown機能しないようです。

su - XX -c /XX

次回起動すると、VirtualBoxはシステムが実行中であることを知らせるため、 Abortedスクリプトは実行されませんでした。 (スクリプトを手動で起動すると私には効果的でした)

PS:活性化しました。shutdown.target

編集する

問題は私が思ったよりも複雑なようです。私のシステムでは.bashrc実行されている場合にtty3実行startxされるため、systemdがシャットダウン/再開することを決定するVBoxSVCと、X Sessionが終了するとプロセスやその他のエントリが終了します。

また、ソースコードをクラッキングして、xfsm-shutdown-helper偽のコードを作成し、systemctlスクリプトを最初に実行してみましたが、上記のいずれも動作しませんでした。

ベストアンサー1

私が正しく理解したら、tty3のbashセッションが終了する前、またはXserverが終了する前にVBシステムを中断したいと思います。

私は.bashrcでXsessionを起動するので、systemdが実行されているXsessionを認識しないと思います。したがって、シェルまたはXsessionを終了する前に、systemdにVBを一時停止するように指示するのは難しいでしょう。終了シーケンスで「十分に早い」位置を見つける必要があります。これは、「ユーザーコンテンツ」と「システムコンテンツ」が混在しているため、見つけるのが難しく、意味上問題がある可能性があります。

解決策は、systemdがプロセスを終了する方法によって多少異なりますが、次の内容は少なくとも良い方向を教えてくれます。

シェルが終了する前

suspendVB() {
        echo "suspending VBs"
        # put real code here
        exit
}

trap suspendVB EXIT

bash用のrcファイルにするか、.bashrcに追加すると、suspendVB()シェルが終了する前にその中のコードが実行されます。以下を実行してテストできます。

bash --rcfile xxx

ファイルにxxx上記のコードが含まれています。これはテスト目的のためだけに現在のシェル内の他のシェルを起動します。単純シャットダウンを実行すると、以下が表示されます。

martin@beaureve:~$ exit
exit
suspending VBs
/home/martin >

その後、元の(ログイン)シェルに戻ります。

systemdが実際にログインシェルを終了する方法を理解する必要があるかもしれませんEXITtrap詳しくは、コマンドを見つけてください。

systemdが「-9」(SIGKILL)を使用してプロセスを終了すると、終了をキャッチできません。つまり、幸運ではありません。

Xsessionが終了する前

あるいは、Xsessionで同様のことを試すこともできます。 systemdがXsessionを終了する場合、これは非常に重要です。今後シェルが終了します。 Xスタートアップファイル(.xinitrcなど)の1つにトラップを挿入できます。マニュアルページを見つけてstartx詳細xinitをご覧ください。

ファイルが私のファイルに似ていて、xserverが前景から始まる場合は、実際startxにXが起動する行の後に suspens コマンドを入力することもできます(トラップをまったく使用しません)。

xinit "$client" $clientargs -- "$server" $display $serverargs
retval=$?
echo " --- suspending VBs ---"

「Hang VB」行を入力し、実行したときにstartx -- vt8vt8でフル実行(kde)セッションを取得しました。ログアウトしたときにのみ画面に「Hang VB」行が表示されました。

おすすめ記事