我正在寻找一种使用“at”(atd)创建命令行来安排任务的方法,该方法安排任务在重新启动后执行“更多操作”(一次性任务)。我现在正在寻找的是一种让它在“按”时间表链接在一起的方法。
我的问题是,我在 bash 中迷失了引用/转义。
到目前为止我得到的以及手动执行的有效方法是:
echo "somecommand -someOptions 2>&1 | mail -s \"$HOST after reboot: somecommand -someOptions\" [email protected]" | at now +5 minutes ;\
#do admin stuff before reboot in less than 5 mins here ;\
touch /fastboot ; reboot
如前所述,效果很好。我现在想将整个事情封装到另一个新的“AT”命令中,以便可以将前一个命令行安排到特定的开始时间,而不再需要手动执行。
我认为必须可以将整个内容封装/包含到另一个“at”命令中,所以我想了解如何正确引用/转义它以便它能够工作。
我尝试过这个(不起作用):
echo "echo \"somecommand -someOptions 2>&1 | mail -s \\"$HOST after reboot: somecommand -someOptions\\" [email protected]\" | at now +5 minutes ;\
#do admin stuff before reboot in less than 5 mins here ;\
touch /fastboot ; reboot ; " | at now + 1 minute
我看到它安排了 2 个作业,在重新启动和重新启动之前执行管理工作,但第二个(稍后)作业被扰乱/崩溃,因为我猜是因为一些错误的引用/转义。我想知道并了解更多关于这里发生的事情以及我在逃跑过程中做错的地方。我想我可以在外部 at 使用单引号,因为在这种情况下我不需要任何变量扩展,但我们假设我也想在那里使用变量扩展。在这种情况下,我应该如何正确转义/引用这个东西?
答案1
\\"
当你写的应该是时,你忘记了反斜杠双引号\\\"
。但是您可以通过使用第三种类型的 shell 引用来避免这种情况,即此处文档:
at now + 1 minute <<\!
echo "somecommand -someOptions 2>&1 | mail -s \"$HOST after reboot: somecommand -someOptions\" [email protected]" | at now +5 minutes
#do admin stuff before reboot in less than 5 mins here
touch /fastboot ; reboot
!
答案2
将您想要执行的操作包含在脚本中(bash
、perl
、 ...)。调试脚本。告诉at
运行脚本:
at now + 5
/home/user/bin/doit
^D