稼働時間とともにすべての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
スクリプトに基づいてエラー出力を抑制するには、xargs
aの前にパイプを追加してから、それを使用して目的の形式を取得しました。awk
paste
#!/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
答え2
sed コマンドを追加すると、目的の出力を取得できます。
#!/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 |sed "N;s/\n/ /g"