有没有办法更改atd
作业调度服务使用的初始 shell?特别是在 Ubuntu 中。
at
默认情况下,/bin/sh
在我部署产品的每个 Linux 和 Solaris 中使用它。
GNU确实为您提供了将内联/不调用具有自己的 shebang 行的脚本的crontab
条目设置为默认选项的选项。SHELL=/bin/bash
我知道可以做
at teatime <<< 'bash -c "stuff-better-run-on-bash" '
但这种解决方法也带来了其他问题。
答案1
SHELL
对于 CentOS 和相关系统,在发出命令时会读取环境变量at
,并将其用作执行命令的 shell,如果未设置,则使用用户的登录 shell。Ubuntu 似乎忽略了这一点,尽管它会警告你 - 。warning: commands will be executed using /bin/sh
你不能只将命令写在文件中并将 shebang 放在顶部吗?
#!/bin/bash
milk
sugar
然后运行它
at teatime -f script
答案2
或许,这并不是您完全想要的,但是您可以让您的工作始终运行 shell 脚本,并使用您选择的 shell,不是吗?
答案3
我不喜欢它,但一个解决方法是立即修改新后台处理作业的第 1 行。
master@chopin~/dev Sat Mar 10,20:52:58$ (4800) atq
616 Tue Mar 13 19:17:00 2012 a master
589 Mon Mar 12 16:16:00 2012 a master
617 Tue Mar 13 19:35:00 2012 a master
591 Mon Mar 12 16:23:00 2012 a master
447 Wed Mar 14 09:25:00 2012 a master
586 Mon Mar 12 15:45:00 2012 a master
master@chopin~/dev Sat Mar 10,20:53:01$ (4800) at -c 447
#!/bin/sh
# atrun uid=1000 gid=1000
# mail master 0
umask 22
...
因此,该策略就是在at
此基础上编写一个包装器
拦截其$jobid何时不需要at
运行于下方- 更改 /var/spool/cron/atjobs/ 中最新文件的 shebang shell 行:
sudo <<< 'cd /var/spool/cron/atjobs/ && sed -i -e "1s/\#!\/bin\/sh/\#!\/bin\/bash/" $(ls -1t |head -n1)'
如果at now
timespec 本身存在,则可能存在竞争条件,除非人为地添加了额外的时间(例如 1 秒)。不过在我自己的用例中,我确实需要它运行现在一秒内不行。
不管怎样,这太过系统黑客,以致于无法让我的脚本舒服地使用。