起動が完了するのを待つ方法はありますか?

起動が完了するのを待つ方法はありますか?

次のコマンドでsystemd起動が完了したことを確認できます。

systemctl is-system-running

起動が完了していない場合は、エラーコードが返されます。起動が完了するのを待つには、もちろん返されるまでコマンドを再実行できます0

私は「より良い方法があるだろう」と思いました。ポーリングに頼らない方法はありますか?

私がこれをやろうとしているのは、現在のデバイスにファームウェアをダウンロードしてから再起動して監視し、正しく起動していることを確認するスクリプトがあるからです。現在のsystemctl is-system-runningSSHを介してコマンドを実行して返されるまで、この操作を実行するか、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

答え2

ユニットファイルを待っています

あなたのニーズに合ったプロトタイプは次のとおりです。 1つ目はシステム単位のファイルですwaity.service

$ cat /etc/systemd/system/waity.service
[Unit]
Description=Waity Service
After=systend-user-sessions.service

[Service]
Type=simple
ExecStart=/opt/bin/waity.sh

スタンバイスクリプト

systemdに起動が完了したことを確認するように要求するスクリプトを実行します。

$ cat /opt/bin/waity.sh
#!/bin/bash

while $(sleep 10); do
  echo "waiting for systemd to finish booting..."
  if systemctl is-system-running | grep -qE "running|degraded"; then
    break
  fi
done

echo "systemd finished booting..."
echo "...do something else..."

実行例

これでサービスを有効にします。

$ systemctl enable --now waity.service

システムを起動すると、サービスは確認済みのジョブis-system-runningまたはステータスをsystemctl返すまで10秒間ループを維持します。どちらかは、システムの起動が完了したことを示します。runningdegraded

このサービスの状態:

$ systemctl status waity.service
● waity.service - Waity Service
   Loaded: loaded (/etc/systemd/system/waity.service; static; vendor preset: disabled)
   Active: inactive (dead)

Aug 03 22:06:01 centos7 waity.sh[4519]: Got unexpected auxiliary data with level=1 and type=2
Aug 03 22:06:01 centos7 waity.sh[4519]: Got unexpected auxiliary data with level=1 and type=2
Aug 03 22:06:01 centos7 waity.sh[4519]: systemd finished booting...
Aug 03 22:06:01 centos7 waity.sh[4519]: ...do something else...
Aug 03 22:06:01 centos7 systemd[1]: Child 4519 belongs to waity.service
Aug 03 22:06:01 centos7 systemd[1]: waity.service: main process exited, code=exited, status=0/SUCCESS
Aug 03 22:06:01 centos7 systemd[1]: waity.service changed running -> dead
Aug 03 22:06:01 centos7 systemd[1]: waity.service: cgroup is empty
Aug 03 22:06:01 centos7 systemd[1]: Collecting waity.service
Aug 03 22:07:17 centos7 systemd[1]: Collecting waity.service

上記のメッセージで、ブート完了が検出されたことを確認できます。

Aug 03 22:06:01 centos7 waity.sh[4519]: systemd finished booting...
Aug 03 22:06:01 centos7 waity.sh[4519]: ...do something else...

それが私たちができることです...do something else...。これが完了すると、サービスは完了/停止状態になります。

関連情報