Answers:
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
这样,脚本将继续运行,或者立即恢复控制,而脚本的新后台任务将通过以下两个命令启动:sleep和echo。
常见的错误是试图给任一sleep
或echo
或两个&
这将无法工作按预期。()
尽管启动一系列命令会在一个单独的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多秒的时间来停止它。否则重启将很快,不会延迟。
&
以使睡眠成为背景;从一开始的第一行就是“您还需要为睡眠做好背景”。如果您不相信我,请查看编辑历史记录。我的答案比您大5分钟:P
()
组的背景,原始外壳将暂停直到生成的外壳完成。)
使用at
命令
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
将在后台运行
echo
通过使用heredoc或herestring完全放弃。
at
是标准的POSIX命令。哪种类Unix系统默认情况下不可用?
如果您希望某件事在5分钟内运行,但程序的其余部分继续(或完成),则还需要使睡眠成为背景:
#!/bin/bash
runWithDelay () {
sleep $1;
shift;
"${@}";
}
runWithDelay 3 echo world &
echo hello
这将打印hello
,然后3秒钟后(退出主程序后),打印world
。
重要的部分是将&
函数执行分叉到后台。
runWithDelay () { sleep $1; "${@:2}"; }
吗?
doWhateverWithDelay 3 &
在您的第二个示例中阅读。
$@
是您可以对其进行引用,并将其扩展为被引用单词的列表。因此,最好做成它"$@"
(或者"${@}"
如果您喜欢大括号)。参见pastebin.com/MU7hbB2C
-n
)的args ,但是显然这有点天真。