如何在bash/linux脚本中执行相同的循环1小时?

Fro*_*ost 4 linux bash shell

我想以随机间隔打开和关闭一些网页一小时.

到目前为止,我已经写了内脏

FILE=webpages
TIMES=0
while test $TIMES -lt 10
do
    #Picks random line(Website) from FILE
    TEMPWEB=`shuf -n 1 $FILE`
    echo "Opening" $TEMPWEB
    #Opens TEMPWEB
    xdg-open $TEMPWEB
    sleep 10
    #Kills firefox
    ps -e | grep firefox | sed 's/\(.[0-9]*\).*/\1/' | xargs kill
    TIMES=$(($TIMES+1))
done
Run Code Online (Sandbox Code Playgroud)

所以我错过了这个条件.
我想要的东西:

TIMER = 0h 0m 0s
while( TIMER < 1 h)
   ....
done
Run Code Online (Sandbox Code Playgroud)

这可能吗?

PS.什么是随机数的命令?

thi*_*ton 15

一定.尝试:

#!/bin/bash
START=`date +%s`
while [ $(( $(date +%s) - 3600 )) -lt $START ]; do
    ....
done
Run Code Online (Sandbox Code Playgroud)

date +%s 显示自1970年以来的当前时间(秒).循环计算一小时前的当前日期并检查它是否超过开始时间.


Chr*_*s J 9

一种方法是使用信号和陷阱.这是一个简单的例子:

#!/bin/bash

me=$$

# Start a background process to signal us when the time has passed
(
        sleep 10
        kill -USR1 $me
) &

# When we recieve SIGUSR1, commit suicide
trap "kill $me" SIGUSR1

# Do stuff until we commit suicide
while [ 1 -eq 1 ]
do
        echo 'Hello!'
        sleep 1
done
Run Code Online (Sandbox Code Playgroud)

评论是自我解释(我希望).第一部分启动一个只睡眠一段时间的后台进程(在本例中为10秒),然后当它唤醒时将SIGUSR1发送到原始进程.

shellscript捕获了这个(with trap)并且只发出一个kill自己的PID,停止进程.

其余部分只是一个无限循环 - 它trap会杀死脚本并终止循环.

从技术上讲,你不需要上面例子中的陷阱:后台进程可以kill $me直接发布,但我已经将它包含在内以便完整,因为你可以将它用作钩子来做其他事情(例如,如果你不想要死,但设置一个标志,让循环自然终止,或者你有一些清理要做终止之前).