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