将作业调度程序(如 CRON)的默认 shell 更改为 /bin/bash

将作业调度程序(如 CRON)的默认 shell 更改为 /bin/bash

有没有办法更改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此基础上编写一个包装器

  1. 拦截其$jobid何时at运行于下方不需要
  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 nowtimespec 本身存在,则可能存在竞争条件,除非人为地添加了额外的时间(例如 1 秒)。不过在我自己的用例中,我确实需要它运行现在一秒内不行。

不管怎样,这太过系统黑客,以致于无法让我的脚本舒服地使用。

相关内容