如何检查长时间任务是否正常运行? /如何在命令运行后的给定时间后启动一个函数?

时间:2016-07-24 18:47:13

标签: bash

如何检查长时间任务是否正常运行? (如何在命令运行时给定时间后启动一个函数)?

我正在编写一个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 个答案:

答案 0 :(得分: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

修改:将函数调用取出循环。整理代码放入陷阱声明。