2016-07-24 2 views
0

Как проверить правильность работы долгого времени? (Как запустить функцию после заданного времени во время выполнения команды)?Как проверить правильность работы долгого времени?/Как запустить функцию после заданного времени во время выполнения команды?

Я пишу скрипт bash для загрузки некоторых файлов регулярно. Я хочу сообщить, когда начата успешная загрузка.

Но я не мог исправить это.

#!/bin/bash 

URL="http://testurl" 
FILENAME="/tmp/test" 
function is_downloading() { 
    sleep 11 
    echo -e "$DOWNLOADING" # 0 wanted here with a failed download but always get empty 
    if [[ $DOWNLOADING -eq 1 ]]; then 
     echo "Send Message" 
     # send_msg 
    fi 
} 
while [[ 0 ]]; do 
    is_downloading & 
    DOWNLOADING=1 
    curl --connect-timeout 10 --speed-time 10 --speed-limit 1 --location -o "$FILENAME" "$URL" 
    DOWNLOADING=0 
    echo -e "$DOWNLOADING" 
    sleep 3600 
done 

ответ

1

is_downloading работает в другом процессе, лучшее, что можно было видеть, является копией наших переменных в то время он начал. Переменные не разделяются, bash не поддерживает многопоточность (пока).

Таким образом, вам необходимо организовать некоторую форму межпроцессного взаимодействия (IPC). Есть много доступных методов, я предпочитаю именованный канал (также известный как FIFO). Что-то вроде этого:

function is_downloading() { 
    thepipe="$1" 

    while : 
    do 
     read -r DOWNLOADING < "$thepipe" 
     echo "$DOWNLOADING" 
     if [[ $DOWNLOADING -eq 1 ]]; then 
      echo "Send Message" 
      # send_msg 
     fi 
    done 
} 

pipename="/tmp/$0$$" 
mkfifo "$pipename" 

is_downloading "$pipename" & 

trap 'kill %1;rm "$pipename"' INT TERM EXIT 

while : 
do 
    DOWNLOADING=1 
    echo "$DOWNLOADING" > "$pipename" 
    curl --connect-timeout 10 --speed-time 10 --speed-limit 1 --location -o "$FILENAME" "$URL" 
    DOWNLOADING=0 
    echo "$DOWNLOADING" > "$pipename" 
    sleep 3600 
done 

Модификации: выполнен вызов функции из цикла. Кодирование кода в ловушке.

+0

Спасибо. И вот некоторые ссылки для $ 0 и $$, правильно? https://stackoverflow.com/questions/29258603/what-do-0-1-2-mean-in-shell-script https://stackoverflow.com/questions/78493/what-does-mean-in- the-shell То, что я не могу понять, это убить% 1 и rm-канал после мертвой петли. – Al3n

+0

'kill' в конце уничтожит задание' is_downloading', так как оно находится в бесконечном цикле. «% 1» - это текущий номер задания фона - вам не нужен его pid. Но из-за бесконечного цикла он не получит его. Как выйти из этого? Ctrl + C? Если хотите, мы можем обработать сигнал. – cdarke

+0

Еще одна вещь: нужно ли вы называть эту функцию на каждой итерации цикла? Я думаю, было бы лучше, если бы он был вызван один раз перед циклом. См. Правки. – cdarke

Смежные вопросы