如何检查长时间任务是否正常运行? (如何在命令运行时给定时间后启动一个函数)?
我正在编写一个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
答案 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
修改:将函数调用取出循环。整理代码放入陷阱声明。