Вы пытаетесь убежать не от if
, а от test
/ [
. Но вы не тестируете выполнение kill
таким образом; вы тестируете строки. Вы хотите:
if kill -0 "$LAST_PID"; then...
, что проверит код возврата kill
.
Некоторые идеи:
ping
имеет статус выхода -0, если он получил ответ, не -0, если нет. Вы можете использовать это вместо поиска. wait
для их ожидания. Таким образом, вам не нужно ждать 4 неудачных пинга, чтобы узнать, что ваше интернет-соединение не работает. Этот сценарий (только для 2 IP-адресов и не включает ваши журналы, вы можете легко расширить его )даст ответ через очень короткое время (ваш работает не менее 30 секунд + любые тайм-ауты пинга )и вернуть статус выхода 0 или 1 в зависимости от того, успешно ли прошла проверка связи или все не удалось. Он использует опцию -W для установки короткого тайм-аута; если ваше интернет-соединение действительно нестабильно, по крайней мере, один из адресов должен вернуть ответ менее чем за секунду.
#!/bin/sh
IP1=8.8.8.8
IP2=4.4.4.4
#start first ping, remember its pid
ping -W 1 -c 1 $IP1 >/dev/null&
PID1=$!
# start second ping, remember its pid
ping -W 1 -c 1 $IP2 >/dev/null&
PID2=$!
# wait for pings to finish
if wait $PID1
then echo $IP1 is reachable, internet is working; exit 0
fi
if wait $PID2
then echo $IP2 is reachable, internet is working; exit 0
fi
# none reachable
echo all pings failed, internet is down
exit 1