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

a6b3iqyw  于 2022-11-16  发布在  Shell
关注(0)|答案(4)|浏览(485)

我想在一个小时内随机打开和关闭一些网页。
到目前为止,我已经写出了内部的内容。

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

所以我错过了while条件。
我想要这样的东西:

TIMER = 0h 0m 0s
while( TIMER < 1 h)
   ....
done

这可能吗?
PS.有什么命令要乱数?

afdcj2ne

afdcj2ne1#

当然。试试看:

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

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

ig9co6j1

ig9co6j12#

其中一种方法是使用信号和陷阱。下面是一个简单的例子:

#!/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

第一部分启动一个后台进程,该进程只休眠一段时间(本例中为10秒),然后当它醒来时向发起进程发送SIGUSR 1。
shellscript捕获此错误(使用trap),并向其自己的PID发出kill,从而停止进程。
其余部分只是一个无限循环--是trap杀死脚本并终止循环。
从技术上讲,您不需要上例中的陷阱:后台进程可以直接发出kill $me,但为了完整起见,我将其包括在内,因为您可以将其用作一个钩子来执行其他操作(例如,如果您不想终止,但设置了一个标志并让循环自然终止,或者在终止之前需要进行一些清理)。

js4nwp54

js4nwp543#

这就是我的解决方案:

#!/bin/bash

# function to display a number in a range
randrange() { echo $(( ( RANDOM % ($2 - $1 +1 ) ) + $1 )); }

# sleep 1 hour and keep backgrounded PID in a variable
sleep 3600 & _suicide_pid=$!

# while the process is UP
while kill &>/dev/null -0 $_suicide_pid; do
    # ----->8--- do what you want here <---8<-----
    sleep $(randrange 10 15) # random sleep in 10-15 range
done
slmsl1lt

slmsl1lt4#

我的解决方案基于the one from thiton

#!/bin/bash

STOP=`date -d 'next hour' +%s`
while [ $(date +%s) -lt $STOP ]; do
    date
    sleep 2
done

内联也能正常工作:

STOP=`date -d 'next hour' +%s`; while [ $(date  +%s) -lt $STOP ]; do date; sleep 2; done

相关问题