使用'sudo'运行延迟命令

8
我想以root身份运行一个Bash脚本,但是需要延迟执行。我该如何实现?
sudo "sleep 3600; command" , or
sudo (sleep 3600; command)

无法工作。


我不理解下面的答案建议使用cron,因为它用于服务器上定期计划的事件。如果您想执行一次性操作,则at是一个更好的选择 - Jordan Reiter
当然。因此我接受了带有 at 的答案。 :) - kobame
4个回答

27

你可以使用 at 命令:

sudo at next hour

然后你需要输入命令并使用Ctrl+D关闭文件。另外,你也可以在文件中指定要运行的命令:

sudo at -f commands next hour

1
是的,因为对于超级用户而言cron是首选。 - chrisdowney

4

如果你真的必须避免使用cron

sudo sh -c "(sleep 3600; command)&"

0

最简单的答案是:

sudo bash -c 'sleep 3600; command' &

因为sleep是一个shell命令而不是可执行文件,分号也是一个shell“运算符”,所以它是一个shell脚本,因此需要在shell中运行。bash -c告诉sudo运行bash并将其作为字符串传递要执行的脚本。

当然,这会一直“挂起”,直到command实际完成运行,或者如果退出周围的shell,则被杀死。我还没有找到一种简单的方法来在这里使用nohup来防止这种情况发生,此时,您基本上正在重新实现at命令。但是我发现上述解决方案在许多简单情况下非常有用。;)

对于任何更复杂的情况...当然,您始终可以创建一个真正的shell脚本文件,在开头加上shebang(#! ...),然后运行它。但我认为整个重点是您想避免为此编写如此简单的内容。

理论上,您可以使用Bash的... <(...)语法将字符串作为文件传递,但sudo希望它是一个真正的文件,并且标记为可执行文件,因此这不起作用。


-2

使用:

sleep 3600; sudo <command>

无论如何,在你的情况下,我会考虑使用cron...


1
一个小时后会要求输入密码 - 我想现在输入密码。 - kobame
1
在这种情况下,我认为chrisdowney已经很好地解决了它。您还可以使用sudo bash -c 'sleep 3600; command' - thebodzio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接