«前の日記(2016-05-26) 最新 次の日記(2016-08-06)» 編集

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

OSS活動をご支援いただける方を募集しています


2016-08-01

稼働中のシステムが systemd が動いているかをシェルコマンドで判定する

タイトルの通りです。シェルスクリプト中で systemd かそうじゃないかによって処理を分けたい場合の判定をしたいというケースを想定しています。最終的に以下の様なコードを採用することになりました。

想定していたのは以下の様な要件です。

  • 実際に systemd が稼働しているかを判定する
  • なるべく短い記述で実現する
  • なるべく多くのシステムにインストールされているコマンドを使う
  • FreeBSD や OS X でも動作し非 systemd として判定される
  • Solaris はまあ…見なかったことにする

hash systemdhash systemctl といった systemd 固有のコマンドが存在するかどうかで判定する方法は却下しました。なぜなら、systemd や systemctl コマンドが存在しても、それが使われているとは限らないからです。systemd がインストールされていても PID=1 が Upstart や SysVinit なシステムだってあるかもしれません(本当にあるのか)?

systemd は init の代わりなので、当然 PID は 1 となります。ということは、PID が 1 なプロセスの名前 systemd かどうかを見てやれば OK です。GNU/Linux なシステム以外でも正常に動作するという要件があるため、以下の様な方法は却下となりました。

[ "$(pgrep --count systemd)" -nq 0 ]
pgrep --count | grep -q ^1$

以下の方法は次点です。GNU/Linux 以外でも動きます。一長一短ありで今回は採用しませんでした。

[ "$(cat /proc/1/comm 2>/dev/null)" = "systemd" ]
[ -z "$(pidof systemd)" ]

他によりよい方法があったら教えて下さい。