将作业调度器的默认shell更改为/ bin / bash,就像在CRON中一样

有没有办法改变atd作业调度服务使用的初始shell? ESP。 在Ubuntu中。

at默认情况下,在每个已部署产品的Linux和Solaris上使用/bin/sh

GNU的crontab可以让你select将SHELL=/bin/bash设置为内联/不调用具有自己的shebang行的脚本的默认值。

我知道可以做

 at teatime <<< 'bash -c "stuff-better-run-on-bash" ' 

但是这样的解决方法带来了其他问题。

对于CentOS和相关的环境variablesSHELL是在at命令被读取的时候被读取的at这个被用作shell来执行命令,或者如果没有设置,那么使用用户的loginshell。 它看起来像Ubuntu忽略了这一点,虽然它警告你 – warning: commands will be executed using /bin/sh 。 你能不能把你的命令写在一个文件中,并把顶部放在一个shebang?

 #!/bin/bash milk sugar 

然后运行它

 at teatime -f script 

也许不完全是你想要的,但是你可以随时在你的作业中运行一个shell脚本,用你select的shell,不是?

我不喜欢它,但一个解决方法是立即修改新假脱机作业的第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 ... 

所以这个策略就是在上面写一个包装器

  1. 不需要的地方运行时截取它的$ jobid
  2. 更改/ 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 by-time timespec的情况下的竞赛条件,除非可能增加额外的时间(如1秒)。 虽然在我自己的用例中,我真的需要现在运行而不是在1秒内。

无论如何,这是太多的系统黑客舒适地使我的脚本使用。