bash + печать всех включенных сервисов на Linux-машине со временем -

Если имя устройства заканчивается цифрой, то ядро ​​добавляет символ 'p', чтобы отделить номер раздела от имени устройства.

/dev/sda -> /dev/sda1
/dev/mmcblk0 -> /dev/mmcblk0p1

Подробнее см. disk_nameфункция в исходных кодах ядра Linux (linux/block/partition -generic.c):

if (isdigit(hd->disk_name[strlen(hd->disk_name)-1]))
    snprintf(buf, BDEVNAME_SIZE, "%sp%d", hd->disk_name, partno);
else
    snprintf(buf, BDEVNAME_SIZE, "%s%d", hd->disk_name, partno)
-1
06.04.2021, 12:47
2 ответа

Взяв ваш скрипт, я добавил один канал черезxargs(передawk)a, чтобы подавить вывод ошибок, а затем просто использовал 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-, доступном для большинства дистрибутивов. Обратите внимание, что моя команда использует способ вызова debiandateutils-, который может различаться в разных дистрибутивах. «Хак» 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
28.04.2021, 22:54

Вы можете получить требуемый результат, добавив команду 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"
2
28.04.2021, 22:54

Теги

Похожие вопросы