Этот подход не будет работать по двум причинам:
- В
ping
команда выполняется до тех пор, пока не будет прервана. Другими словами: будет только одна итерация цикла, потому что вы застряли в цикле.
cat ~/.test
всегда будет «истинным» (то есть успешным), если файл существует. Он будет только «ложным» (т. Е. Выйти с ненулевым кодом ошибки), если файл не существует (более). cat
is не подходит для проверки изменений файла - если это изменение не создает или не удаляет файл.
Имея это в виду, вероятно, вы должны попробовать что-то вдоль этих линий:
#!/bin/bash
# launch the ping process and leave it running in the background
ping -f 10.0.1.1 &
# get the process ID of the previous command's process
PING_PID=$!
# until the file ~/.test does not exist any more,
# do the stuff in the loop ...
until ! test -f ~/.test; do
# sleep for one second
sleep 1
done
# kill the ping process with the previously stored process ID
kill $PING_PID
Скрипт тестировался и не может работать полностью, но это должно дать вам представление о том, как решить вашу проблему.
Edit: Если это не нужно быть наводнения пинг, вы можете использовать этот простой скрипт:
#!/bin/bash
# As long as the file ~/.test exists,
# send one ping only to the target.
while test -f ~/.test; do
ping -c 1 10.0.1.1
done
Этот подход был предложен twalberg.
Еще одно преимущество этого подхода (помимо более простого сценария) состоит в том, что вам больше не нужна команда ping, поскольку в отличие от флуоресцентных пингов «обычные» пинги не нуждаются в привилегиях root.
Я бы предложил 'ping -c 1 10.0.1.1' внутри цикла' until' (или 'while'), а не фонировать и убивать ... – twalberg
@twalberg: Да, это обычно лучший подход. Тем не менее, опция «-f» для пинга означает «флуд-пинг», и просто делает один пинговый тип поражения от наводнения. Поэтому, если поток ping не требуется, текущий способ с фоном и последующим убийством, похоже, в порядке. – Striezel
Не следует 'while [test -f ~/.test]; do' be 'while test -f ~/.test; do' или 'while [-f ~/.test]; do'? – user000001