次のコマンドでsystemd
起動が完了したことを確認できます。
systemctl is-system-running
起動が完了していない場合は、エラーコードが返されます。起動が完了するのを待つには、もちろん返されるまでコマンドを再実行できます0
。
私は「より良い方法があるだろう」と思いました。ポーリングに頼らない方法はありますか?
私がこれをやろうとしているのは、現在のデバイスにファームウェアをダウンロードしてから再起動して監視し、正しく起動していることを確認するスクリプトがあるからです。現在のsystemctl is-system-running
SSHを介してコマンドを実行して返されるまで、この操作を実行するか、0
起動が完了するのにかかる時間内には返されません。できるだけ早くこれを完了してください。
ベストアンサー1
ループ内でこのコマンドをポーリングせずにこの条件を待つことは可能ですが、残念ながらそれほど単純ではありません。
systemdは起動完了信号スタートアップが完了すると、D-Busでモニタリングが可能になり、モニタリングと通知が可能です。
ここに一つあります。シンプルなdbus-wait
ツールD-Busの信号を監視できます。
次のコマンドを使用して起動が完了するのを待ちました。
dbus-wait org.freedesktop.systemd1.Manager StartupFinished
このアプローチの問題は、競争条件があることです。まず、システムが稼働していることを確認し(使用してsystemctl is-system-running
)、まだ「起動中」であることを確認してから、信号を待つことにした場合は、システムがdbus-wait
バスに接続して信号を待機し始めます。その後、systemdはブートを終了し、バスに公開されます。このシグナルは、dbus-wait
発生しないイベントを待ってから最終的にタイムアウトします。
一方、これをRace Conditionの影響を受けない方法で実装することが可能でなければなりません。 。ループが信号を待っています。
上記の方法を実装し、それをアップストリームsystemdに提案しました。私の提案はこの目的のために実行を許可することですsystemctl is-system-running --wait
(しかし、これは最終的にsystemdで別の構文(別々のコマンド)を使用することができます)新しいsystemd機能の提案は以下にあります。広報#9796systemdプロジェクトで。 (この回答が承認され、マージされたら更新します。)
修正する:広報#9796これはsystemdにマージされたので、systemd v240から次のように起動が完了するのを待つことができます。
systemctl is-system-running --wait