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


33

有人可以告诉我如何制作程序来执行此操作吗:5分钟后

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

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

Answers:


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

这样,脚本将继续运行,或者立即恢复控制,而脚本的新后台任务将通过以下两个命令启动:sleep和echo。

常见的错误是试图给任一sleepecho或两个&这将无法工作按预期。()尽管启动一系列命令会在一个单独的shell进程中生成它们,然后您可以使用将其发送到后台&


对此,我发现它非常有用。在我开发的嵌入式设备中,有一个与看门狗一起使用的主要应用程序。如果它以某种方式失败,并在启动后立即触发看门狗重置,反复多次,则很难远程修复,因为操作系统启动和重置之间的时间间隔很短,不足以插入并阻止应用启动。因此,我需要一种方法来确定系统重新启动的速度如此之快并引入延迟(如果这样做的话),以便让我有时间手动修复它。

 [ -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多秒的时间来停止它。否则重启将很快,不会延迟。


是的,我同意,但这也可能是用户反思的一部分;-)
Kiwy 2013年

其他答案似乎错过了“背景”部分。 不,我对此非常清楚:/
goldilocks

@goldilocks:仅在我发布答案后,您才将发送添加到后台部分。
SF。

不,我最初的答案是运行一个包含sleep的功能&以使睡眠成为背景;从一开始的第一行就是“您还需要为睡眠做好背景”。如果您不相信我,请查看编辑历史记录。我的答案比您大5分钟:P
goldilocks

1
@gekannt:...呃,问题是“如何在后台延迟运行命令?” -否则您将如何实现?(并且不,如果您不作为()组的背景,原始外壳将暂停直到生成的外壳完成。)
SF。

11

使用at命令

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

将在后台运行


2
这是正确的方法,但是它确实需要运行atd守护程序,并且在大多数系统上都需要安装软件包。
朱利安

您可以使用单引号来避免转义,并echo通过使用heredoc或herestring完全放弃。
克里斯·

@Julian,at是标准的POSIX命令。哪种类Unix系统默认情况下不可用?
斯特凡Chazelas

1
@StéphaneChazelas-好问题。我知道我遇到了这个问题,但这是前一段时间。我做了一点检查,at命令看起来确实无处不在。而且atd似乎是特定于Linux的,甚至在某些Linux系统上也可能被BSD风格的cron守护程序代替。让我们考虑一下我的评论已过时。
朱利安

我尝试了“ at”操作,但在Android 8上未找到命令
beppe9000

6

如果您希望某件事在5分钟内运行,但程序的其余部分继续(或完成),则还需要使睡眠成为背景:

#!/bin/bash

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

runWithDelay 3 echo world &
echo hello    

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

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


1
我可以建议runWithDelay () { sleep $1; "${@:2}"; }吗?
manatwork 2013年

1
我认为应该doWhateverWithDelay 3 &在您的第二个示例中阅读。
巴恩

@manatwork:干杯。
goldilocks 2013年

1
@goldilocks,使用时必不可少的$@是您可以对其进行引用,并将其扩展为被引用单词的列表。因此,最好做成它"$@"(或者"${@}"如果您喜欢大括号)。参见pastebin.com/MU7hbB2C
manatwork

@manatwork:观点;)我确实尝试使用带有echo(-n)的args ,但是显然这有点天真。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.