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

답변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"

관련 정보