我想创建一个运行命令的bash脚本,然后在10分钟后结束它(本身并不困难)。但是,如果再次调用,我希望它将原始脚本的超时重置为0并退出。
目的是让命令在过去10分钟内调用脚本时运行。我确实考虑过文件+时间戳,但它并不是一个优雅的解决方案。也许发出信号?
提前致谢! 詹姆斯
答案 0 :(得分:2)
在脚本运行时将脚本的进程ID保存到文件中,并在脚本运行完毕后删除该文件。如果存在PID的文件,则可以将其用作条件向进程发送信号以重置计数器。
#Set the counter to 0 at start and reset the counter on receiving signal USR1
i=0
trap "i=0" USR1
#If script already running, send signal to the PID and exit
pid_file=/tmp/myscriptpid
if [[ -e $pid_file ]]
then
kill -s USR1 $(cat $pid_file)
exit 0
fi
#Otherwise capture the PID and save to file, clean up on exit
echo "$$" >$pid_file
trap 'rm -f "$pid_file"' EXIT
然后你想要在后台运行你的命令,并在你完成后杀死它:
#Run the command in the background
your_command &
your_command_pid=$!
#Increment $i once each second.
count() {
sleep 1
((i++))
}
#Note that $i is reset to 0 if the script receives the USR1 signal.
while (( $i < 600 ))
do
count
done
#Kill the running command once the counter is up to 600 seconds
kill "$your_command_pid"
答案 1 :(得分:0)
你好jleck
检查以下脚本并进行更新。
#!/bin/bash
now=$(date +%s)
final=$(awk 'END {print}' /var/log/count.log 2> /dev/null)
when=$(date --date @${final} 2> /dev/null)
if (($(echo $final | wc -w) > 0)); then
t1=$(expr $(expr $now - $final) / 60)
if (($t1 < 30)); then
time=0
else
time=600
fi
else
time=600
fi
if (( $time > 0 )); then
your_command &
PID=$!
sleep $time
kill -9 $PID
date +%s >> /var/log/count.log
else
echo "Command Was Executed on $when, Kindly Execute after $(expr 30 - $t1) minutes"
fi
在此之后,第一次执行超时将重置为0,并且将在30分钟差异后10分钟再次执行