我想在我的shell脚本中放置超时,以便在其中完成进程,例如,如果我想scp一个文件,如果该文件没有通过错误在超时内转移,如果成功回应成功消息,怎么放超时?
答案 0 :(得分:1)
使用timeout(1)
。比你必须编写,调试和维护的自制解决方案要好得多。
答案 1 :(得分:0)
以此为例:
command & # start a new process in background
pid=$(pidof command | cut -f1 -d' ') # save pid of started process
sleep(timeout_value) # set timeout value to match your desired time to process
pids=$(pidof command) # get all pids of running processes of this command
if [[ $(grep "$pid" "$pids") ]]; then # if started process still running
echo "error"
else
echo "success"
fi
更改word命令以匹配您的实际命令。我不确定这是否适用于管道,我会在一分钟内测试它并回复给您。
对于管道命令,您可以执行以下操作(前提是您使用bash执行):
(command | other_command | ...) &
pid=$(pidof bash | cut -f1 -d' ') # save pid of started process
sleep(timeout_value) # set timeout value to match your desired time to process
pids=$(pidof bash) # get all pids of running bash processes
if [[ $(grep "$pid" "$pids") ]]; then # if started process still running
echo "error"
else
echo "success"
fi
<强>问题强>
请注意,有更好的答案,因为此脚本将始终等待整个超时。这可能不是你想要的。
可能的解决方案
一种可能的解决方案是多次睡眠,如下所示:
for i in $(seq 1..100); do
sleep(timeout/100) # sample the timeout interval
pids=$(pidof bash)
if [[ $(grep -v "$pid" "$pids") ]]; then # if process no longer running
echo "succes" && exit 0 # process completed, success!
elif [[ $i -eq 100 ]]; then
echo "error" # at the end of our timeout
fi
done
注意:如果超时很长,请更改值100,尝试优化它,以便每次迭代的超时时间不会太长。