Прочитать все строки, кроме закомментированных, строки, содержащие 'bind | swap | shm' из / etc / fstab, и вывести в них те, которые не смонтированы? - PullRequest
1 голос
/ 12 января 2020

Считать все строки, кроме закомментированных, строки, содержащие 'bind | swap | shm' из / etc / fstab, и вывести в них те, которые не смонтированы? Я попробовал следующее, и мне было интересно, смогу ли я получить лучший более короткий код.

mount_check()
{
fstb=$(cat /etc/fstab |egrep -vw 'bind|swap' |awk '$1 !~/#|^$/ {print $2}')
for i in ${fstb}
do
df -hPT | grep -wq ${i}
if [ $? -eq 1 ]
 then
 echo "The file system ${i} has an entry in /etc/fstab file but not mounted"
fi
done
}rc_mount_check=`mount_check |tee |wc -l`if [ $rc_mount_check -eq '0' ]
then
        echo -e "OK: All file systems listed in /etc/fstab are mounted"
        exit $OK
else
        echo -e "CRITICAL: Please verify and mount the file systems\n$(mount_check)\n"
        exit $CRITICAL
fi

Ответы [ 2 ]

1 голос
/ 12 января 2020

Фактическая команда, которую вы ищете - findmnt. Не могли бы вы попробовать следующее.

awk '
!/bind|swap|shm/ && $1 !~/#|^$/{
  system("if [[ -n $(findmnt -m " $2 ") ]]; \
          then echo Mount " $2 " is mounted.;\
          else echo Mount " $2 " is NOT mounted.;\
          fi"\
  )
}
' /etc/fstab

ИЛИ в виде однострочника, попробуйте следующее (если вам это нужно):

awk '!/bind|swap|shm/ && $1 !~/#|^$/ {system("if [[ -n $(findmnt -m " $2 ") ]]; then echo Mount " $2 " is mounted.;else echo Mount " $2 " is NOT mounted.;fi")}' /etc/fstab
0 голосов
/ 12 января 2020

Предполагая, что в настоящее время принят ответ:

awk '
!/bind|swap|shm/ && $1 !~/#|^$/{
  system("if [[ -n $(findmnt -m " $2 ") ]]; \
          then echo Mount " $2 " is mounted.;\
          else echo Mount " $2 " is NOT mounted.;\
          fi"\
  )
}
' /etc/fstab

делает то, что вы хотите, вы должны вместо этого сделать что-то вроде этого (не проверено):

mounts=( $(awk '!/bind|swap|shm/ && $1 !~/#|^$/ { print $2 }' /etc/fstab) )
for mount in "${mounts[@]}"; do
    if [[ -n $(findmnt -m "$mount") ]]
        then echo "Mount $mount is mounted."
        else echo "Mount $mount is NOT mounted."
    fi
done

т.е. не вызывать shell вызывать awk для вызова system для вызова shell для вызова findmnt. Просто введите shell: 1) вызовите awk, чтобы получить список монтирований, из которых выплевывается первая строка awk, а затем 2) вызовите findmnt из этого списка. Таким образом, вы не порождаете подоболочки на подоболочки и глубиной 5 слоев для каждой горы.

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