有没有办法改变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 ...
所以这个策略就是在上面写一个包装器
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秒内。
无论如何,这是太多的系统黑客舒适地使我的脚本使用。