bash + Linuxシステムでアクティブなすべてのサービスと稼働時間を印刷する

bash + Linuxシステムでアクティブなすべてのサービスと稼働時間を印刷する

稼働時間とともにすべてのsystemctlサービスのリストを提供するために、次の簡単なスクリプトを作成しました。

rhel 7.2 システムでスクリプトを実行しています。

#!/bin/bash
for i in ` systemctl list-unit-files | grep enabled | awk '{print $1}' `
do
echo -e $i
systemctl status $i | grep "Active:" |  awk -F";" '{print (NF>1)? $NF : ""}'
done

スクリプトは次の出力例を出力します。

accounts-daemon.service
 4 months 4 days ago
appdynamics-machine-agent.service
 9 months 21 days ago
atd.service
 9 months 21 days ago
auditd.service
 9 months 21 days ago
[email protected]
Failed to get properties: Unit name [email protected] is missing the instance name.
bluetooth.service
 9 months 21 days ago
chronyd.service
 2 days ago
crond.service
 7 months 25 days ago
dbus-org.bluez.service
 9 months 21 days ago
dbus-org.freedesktop.ModemManager1.service
 9 months 21 days ago
display-manager.service
 9 months 21 days ago
dmraid-activation.service
 9 months 21 days ago
gdm.service
 9 months 21 days ago

予想される出力は次のようになります。

accounts-daemon.service      4 months 4 days ago
appdynamics-machine-agent.service       9 months 21 days ago
atd.service       9 months 21 days ago
auditd.service       9 months 21 days ago
[email protected]
Failed to get properties: Unit name [email protected] is missing the instance name.
bluetooth.service    9 months 21 days ago
chronyd.service     2 days ago
crond.service      7 months 25 days ago
dbus-org.bluez.service       9 months 21 days ago
dbus-org.freedesktop.ModemManager1.service       9 months 21 days ago
display-manager.service      9 months 21 days ago
dmraid-activation.service      9 months 21 days ago
gdm.service      9 months 21 days ago

私が保持したい最高の出力は次のようになり、読みやすくなります。

accounts-daemon.service,up 124 days
appdynamics-machine-agent.service,up 234 days
atd.service,up 234 days
.
.
.
 

ベストアンサー1

スクリプトに基づいてエラー出力を抑制するには、xargsaの前にパイプを追加してから、それを使用して目的の形式を取得しました。awkpaste

#!/bin/bash
for i in ` systemctl list-unit-files | grep enabled | awk '{print $1}' `
do
echo -e $i
systemctl status $i | grep "Active:" |  xargs | awk -F";" '{print (NF>1)? $NF : ""}'
done | paste -d, - - 

「最大X日」更新形式を出力として使用します。これは、状態をチェックし、状態に日付正規表現が一致する場合(死亡または非アクティブサービスまたは他のエラーではない)、日付差を計算します。にかかっているdateutils-パックほとんどのディストリビューションで利用可能です。私のコマンドはdebian呼び出し方法を使用しますdateutils。これはディストリビューションによって異なる場合があります。変化する条件のため、xargsここでは「ハッキング」は必要ありません。sed$status

#!/bin/bash
for i in ` systemctl list-unit-files | grep enabled | awk '{print $1}' `
do
echo $i
dateregex='20[0-9][0-9]-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]'
status=$(systemctl status $i | grep "Active:" | sed "s/.*\($dateregex\).*/\1/")
if [[ "$status" =~ $dateregex ]] ; then
    status=$(dateutils.ddiff -f "up %d days" "$status" now)
fi
echo "$status"
done | paste -d, - - 

出力:

syslog.service,up 82 days
systemd-fsck-root.service,up 82 days
systemd-timesyncd.service,up 13 days
triggerhappy.service,up 82 days
wpa_supplicant.service,up 82 days

おすすめ記事