2016-11-22 12 views

ответ

1

Этот подход не будет работать по двум причинам:

  1. В ping команда выполняется до тех пор, пока не будет прервана. Другими словами: будет только одна итерация цикла, потому что вы застряли в цикле.
  2. 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.

+0

Я бы предложил 'ping -c 1 10.0.1.1' внутри цикла' until' (или 'while'), а не фонировать и убивать ... – twalberg

+0

@twalberg: Да, это обычно лучший подход. Тем не менее, опция «-f» для пинга означает «флуд-пинг», и просто делает один пинговый тип поражения от наводнения. Поэтому, если поток ping не требуется, текущий способ с фоном и последующим убийством, похоже, в порядке. – Striezel

+2

Не следует 'while [test -f ~/.test]; do' be 'while test -f ~/.test; do' или 'while [-f ~/.test]; do'? – user000001