systemctl status からの出力が短くなりました

systemctl status からの出力が短くなりました

systemctl status からより短い/カスタムの出力を取得する方法はありますか? 実際に必要なのは、サービス名が先頭に付いたアクティブな行だけです。つまり、次のようになります。

        apache2: active (running) since Thu 2020-02-06 17:20:42 +03; 16min ago
        mongodb: inactive (dead)  since Thu 2020-02-06 17:20:47 +03; 16min ago
rabbitmq-server: active (running) since Thu 2020-02-06 17:20:52 +03; 16min ago
 mongodb-server: active (running) since Thu 2020-02-06 17:20:54 +03; 16min ago
          mysql: active (running) since Thu 2020-02-06 17:20:57 +03; 16min ago

色フィードバックのみ。でも、色なしでも大丈夫です。または、次のように 2 行と空白行でもいいでしょう。

● apache2.service - The Apache HTTP Server
   Active: active (running) since Thu 2020-02-06 17:20:42 +03; 16min ago

● mongodb.service - An object/document-oriented database
   Active: inactive (dead) since Thu 2020-02-06 17:20:47 +03; 16min ago

● redis-server.service - Advanced key-value store
   Active: active (running) since Thu 2020-02-06 17:20:52 +03; 16min ago

● rabbitmq-server.service - RabbitMQ Messaging Server
   Active: active (running) since Thu 2020-02-06 17:20:54 +03; 16min ago

● mysql.service - MySQL Community Server
   Active: active (running) since Thu 2020-02-06 17:20:57 +03; 16min ago

ちなみに、これは後者の要件を満たしています:

systemctl status apache2.service mongodb.service \
redis.service rabbitmq-server.service mysql.service | grep -e Active -e ●

しかし、色がおかしくなり、空白がないので、どこかに systemctl オプションまたは構成があり、まさに自分が望むものが得られるはずだと期待しています。

答え1

したがって、このように出力をフォーマットするネイティブな方法はありませんsystemctlが、パイプを少し工夫することで、とにかくそれを行うことができます。

まず、システム上で実行されているすべてのサービスのリストが必要です。

# systemctl -t service --state=running --no-legend --no-pager

accounts-daemon.service                         loaded active running Accounts Service                                               
atd.service                                     loaded active running Deferred execution scheduler                                   
containerd.service                              loaded active running containerd 
...

systemctl show時間出力はありません。これを取得するには、フラグを使用してユニットに対して呼び出す必要があります--property=ActiveEnterTimestamp。例:

# systemctl show accounts-daemon.service --property=ActiveEnterTimestamp
ActiveEnterTimestamp=Wed 2019-12-11 21:44:50 UTC

さて、その出力を出力の最後にホッチキスで留める方法があればいいのですがsystemctl...あります!

これは醜いワンライナーですが、目的は達成できます。

systemctl -t service --state=running --no-legend --no-pager | cut -d ' ' -f 1 | while read f; do STARTTIME=`systemctl show $f 
--property=ActiveEnterTimestamp | sed 's/ActiveEnterTimestamp=//'`; echo "$f $STARTTIME"; done`

説明する:

  • コマンドはスペースで分割し、サービス名であるcutから最初のフィールドを取得します。systemctl
  • whileループに入り、そのサービス名を変数にパイプします。$f
  • 開始時間フラグ付きの出力STARTTIMEを含む という名前の変数を作成します。systemctl show
  • sed実際のActiveEnterTimestamp=テキストを削除して、時間だけを取得するために使用します。
  • 最後に、echoサービス名とクリーンアップされた開始時刻をスペースで区切って指定します。

最終的な出力は次のようになります。

accounts-daemon.service Wed 2019-12-11 21:44:50 UTC
atd.service Wed 2019-12-11 21:44:48 UTC
containerd.service Wed 2019-12-11 21:44:50 UTC

関連情報