如何在后台延迟运行命令?

如何在后台延迟运行命令?

有人可以告诉我如何编写一个程序来执行此操作:5 分钟后

echo "80" > /sys/class/leds/blue/brightness

我希望这个程序在后台运行(如rngd服务)我不能这样做,因为我对 Linux 不太了解。

答案1

( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &

这样你的脚本就会继续,或者你立即恢复控制,而新的后台任务脚本的开头有两个命令:sleep 和 echo。

常见的错误是尝试给出其中一个sleepecho两个,&但无法按预期工作。虽然启动一系列命令()会在一个单独的 shell 进程中生成它们,然后您可以使用&.


我发现它非常有用。在我开发的嵌入式设备中,有一个与看门狗配合使用的主要应用程序。如果它以启动后不久触发看门狗重置的方式失败,则很难远程修复,因为操作系统启动和重置之间的时间很短,不足以进行 ssh 登录并阻止应用程序启动。因此,我需要一种方法来确定系统重新启动的速度如此之快,并在重新启动时引入延迟,以便给自己时间手动修复它。

 [ -f /tmp/startdelay ] && sleep 30
 touch /tmp/startdelay
 ( sleep 30 ; rm /tmp/startdelay ) &
 [ -f /tmp/noautostart ] && exit 0
 start_app

如果我登录并执行touch /tmp/noautostart主应用程序将不会启动。如果看门狗启动,rm /tmp/startdelay则不会执行,并且下次系统启动时,它会给我额外的 30 秒来停止它。否则重启会很快,不会有延迟。

答案2

使用at命令

echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min

将在后台运行

答案3

如果您希望某个程序在 5 分钟内运行,但程序的其余部分继续(或完成),那么您也需要将睡眠功能置于后台:

#!/bin/bash

runWithDelay () {
    sleep $1;
    shift;
    "${@}";
}

runWithDelay 3 echo world &
echo hello    

这将打印hello,然后 3 秒后(主程序退出后),打印world

重要的部分是&将函数执行分叉到后台。

相关内容