Объедините две команды в bash elif (FreeNAS) - PullRequest
0 голосов
/ 28 января 2020

Мне очень жаль снова раздражать вас своей проблемой, но, похоже, я собираюсь закончить sh. Моя цель - создать bash -скрипт, который проверяет, находится ли IP-адрес в сети или выполняется очистка, и если нет, то мои системы выключаются. Мой скрипт, который в данный момент используется, выглядит следующим образом

#!/bin/bash

hosts=(
  10.10.0.100 #Client 1
  10.10.0.101 #Client 2 
  10.10.0.102 #Client 3 
  10.10.0.103 #Client 4
  10.10.0.104 #Client 5
)

for host in "${hosts[@]}"; do
  if ping -c 1 -i 1 "$host" >/dev/null; then
    echo "No Shutdown - At least one PC ($host) is online"
    exit 0
  fi
done

echo "No PC is online - Shutdown"
bash shutdown -p now

Я провел некоторое исследование и нашел следующую команду, чтобы проверить, выполняется ли мой скраб

if [ $(zpool status | grep 'scrub in progress') ]; then
    echo "No Shutdown - Scrub in progess"
    exit 0
  fi

Но я есть проблемы в сочетании этих двух. Я хочу, чтобы мой скрипт сначала проверил IP-адреса, а если они все не подключены к сети, то проверьте, нет ли скраба, прежде чем он выключит машину. Таким образом, оба if-case должны быть ложными (ips в автономном режиме и очистка не выполняется), но они должны обрабатываться в хронологическом порядке, и если первый if-case возвращает IP, который находится в сети, скрипт должен остановиться.

Может быть, кто-то можете мне помочь?

Ответы [ 3 ]

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

Для меня ответ тривиален:

hosts=(
  10.10.0.100 #Client 1
  10.10.0.101 #Client 2 
  10.10.0.102 #Client 3 
  10.10.0.103 #Client 4
  10.10.0.104 #Client 5
)

for host in "${hosts[@]}"; do
  if ping -c 1 -i 1 "$host" >/dev/null; then
    echo "No Shutdown - At least one PC ($host) is online"
    exit 0
  fi
done

if $(zpool status | grep 'scrub in progress'); then
  echo "No Shutdown - Scrub in progess"
  exit 0
fi    

echo "No PC is online and Scrub is not in progress - Shutdown"
shutdown -p now

Или я упустил суть?

Подумайте над парой исправлений в вашем коде: уберите квадратные скобки вокруг проверьте и удалите bash перед выключением.

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

Чтобы проверить, содержит ли вывод команды строку:

if zpool status | grep -q 'scrub in progress'; then

[ $(zpool status | grep 'scrub in progress') ] недопустимо. $( .. ) расширится до нескольких слов и будет работать [ scrub in progress ]. Поскольку in не является допустимым оператором для [, то [ напечатает сообщение об ошибке и завершит работу с 2. Просто проверьте состояние ошибки grep.

0 голосов
/ 28 января 2020

Вы можете отменить состояние выхода, используя !

if ! ping -c 1 -i 1 "$host" >/dev/null; then
  if ! [[ $(zpool status | grep 'scrub in progress') ]]; then
    echo "No PC is online - Shutdown"
    bash shutdown -p now
  fi
fi

## Add the rest of the script here if both conditions are true.

Это в основном означает, что оба условия ложны, то есть отсутствует работающий хост, и очистка не выполняется, и наоборот без !

Проверьте, выполняются ли оба условия, просто удалите !

if ping -c 1 -i 1 "$host" >/dev/null; then
  if [[ $(zpool status | grep 'scrub in progress') ]]; then
    echo "No Shutdown - At least one PC ($host) is online"
    exit 0
  fi
fi

Проверьте, работают ли хосты, но не работает ли очистка.

if ping -c 1 -i 1 "$host" >/dev/null; then
  if ! [[ $(zpool status | grep 'scrub in progress') ]]; then
   ##: Add/run/execute your code here to start scrub.
  fi
fi

Если вложение это то, что вы хотите, это будет что-то вроде.

for host in "${hosts[@]}"; do
  if ping -c 1 -i 1 "$host" >/dev/null; then
    echo "No Shutdown - At least one PC ($host) is online"
    exit 0
  elif ! ping -c 1 -i 1 "$host" >/dev/null; then
    if ! [[ $(zpool status | grep 'scrub in progress') ]]; then
      echo "No PC is online - Shutdown"
      bash shutdown -p now
    fi
  fi
done

Вы можете добавить тест для zpool внутри первого оператора if.

    for host in "${hosts[@]}"; do
      if ping -c 1 -i 1 "$host" >/dev/null; then
        if [[ $(zpool status | grep 'scrub in progress') ]]; then
          echo "No Shutdown - At least one PC ($host) is online"
          exit 0
        fi
      fi
      elif ! ping -c 1 -i 1 "$host" >/dev/null; then
        if ! [[ $(zpool status | grep 'scrub in progress') ]]; then
          echo "No PC is online - Shutdown"
          bash shutdown -p now
        fi
      fi
    done

Первый пример набора операторов if должно быть достаточно, хотя. см help test

...