![bash + Linux 시스템에서 활성화된 모든 서비스 및 가동 시간 인쇄](https://linux55.com/image/14257/bash%20%2B%20Linux%20%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%97%90%EC%84%9C%20%ED%99%9C%EC%84%B1%ED%99%94%EB%90%9C%20%EB%AA%A8%EB%93%A0%20%EC%84%9C%EB%B9%84%EC%8A%A4%20%EB%B0%8F%20%EA%B0%80%EB%8F%99%20%EC%8B%9C%EA%B0%84%20%EC%9D%B8%EC%87%84.png)
가동 시간과 함께 모든 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"