можем ли мы автоматически подождать необходимое время для smartmontools / smartctl?

Это не всегда возможно, поскольку пользовательские базы данных не всегда перечислимы.

В базе данных passwd(/etc/passwd, LDAP, mysql, NIS+ и т. д. или их комбинации) первичным ключом является имя пользователя. (один и тот же uid может быть у нескольких пользователей, возможно, с разными gid).

Вы всегда можете запросить пользовательскую базу данных для заданного имени пользователя, но не всегда можете получить полный список пользователей.

Можешь попробовать. Стандартной команды для этого не существует, но во многих системах есть команда getent, которую вы можете использовать.

getent passwd

Список пользователей будет возвращен в формате csv (с разделителями-двоеточиями). Первое поле — это имя пользователя, а четвертое — основной GID. Итак, если вы знаете gid, вы можете легко вернуть список пользователей, используя awk.

getent -- group "$group"

Будет запрошена база данных групп для заданной $groupи возвращена одна строка csv, где третье поле — gid. cutбудет достаточно, чтобы извлечь его.

Если пользовательская база данных не перечислима, вы можете попытаться запросить каждый из возможных номеров uid по отдельности (остерегайтесь, что некоторые системы поддерживают uid до 231), но даже в этом случае не гарантируется возврат всех возможные пользователи, так как может быть более одного пользователя для каждого uid, а запросы к базе данных паролей обычно возвращают только одного пользователя.

1
08.08.2017, 03:37
2 ответа

Есть 2 возможности. smartctl -cперечислит возможности устройства, включая такие строки, как

Short self-test routine 
recommended polling time:      (   1) minutes.
Extended self-test routine
recommended polling time:      (  48) minutes.

Таким образом, вы можете просто прочитать их и поспать необходимое короткое или долгое время.

Во-вторых, во время выполнения теста та же самая опция -cбудет отображать текущий статус любого теста, например:

Offline data collection status:  (0x03) Offline data collection activity
  is in progress.
Self-test execution status:      ( 247) Self-test routine in progress...
  70% of test remaining.
Total time to complete Offline 
data collection:    (   44) seconds.

Таким образом, вы можете опрашивать каждые несколько минут и ждать, пока оставшееся время вернется к 0, а другие поля получат свои окончательные значения:

Offline data collection status:  (0x02) Offline data collection activity
  was completed without error.
Self-test execution status:      (   0) The previous self-test routine completed
  without error or no self-test has ever 
  been run.
Total time to complete Offline 
data collection:    (    0) seconds.
3
27.01.2020, 23:16

Это некрасиво, но, похоже, это работает. Может быть легко изменен для обработки произвольного количества дисков. Моды приветствуются.

#!/usr/bin/zsh
#set -x

outputmsg () { echo -e "\e[35;1m$@\e[0m"; }
infomsg ()   { echo -e "\e[36;1m$@\e[0m"; }

smartctl -X /dev/sda &> /dev/null
wait_time_greatest=$( smartctl -t short /dev/sda | grep 'Please wait' | sed 's,^\(Please wait \)\([[:digit:]]*\)\(.*\),\2,' )

smartctl -X /dev/sdb &> /dev/null
wait_time_new=$( smartctl -t short /dev/sdb | grep 'Please wait' | sed 's,^\(Please wait \)\([[:digit:]]*\)\(.*\),\2,' )

[ "$wait_time_new" -gt "$wait_time_greatest" ] && wait_time_greatest="$wait_time_new"

wait_time_greatest=$((wait_time_greatest + 1)) #To be safe?

infomsg "\nWe'll be done in $wait_time_greatest minutes...\n"
sleep "$[wait_time_greatest]m"

outputmsg "Disk sda:"   # Strange that the report doesn't contain the disk ID.
echo -e \e[0m       # Must reset the color!
smartctl -H /dev/sda

outputmsg "Disk sdb:"
echo -e \e[0m       # Must reset the color!
smartctl -H /dev/sdb

# Because smartctl seems to screw this up and it needs to be redone:
hdparm -S60y /dev/sda
hdparm -S60y /dev/sdb
2
27.01.2020, 23:16

Теги

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