Изменение оболочки по умолчанию на /bin/bash в планировщике заданий, как в CRON

Есть ли способ изменить начальную оболочку, используемую atd служба планирования работы? Особенно в убунту.

at по умолчанию использует /bin/sh в каждом Linux и Solaris я развернул продукты.

ГНУ crontab дает вам возможность установить SHELL=/bin/bash по умолчанию для записей, которые встроены / не вызывают скрипт, имеющий собственную строку shebang.

Я знаю, что можно сделать

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

но такие обходные пути создают другие проблемы.

3 ответа

Для CentOS и связанных с ним переменных среды SHELL читается, когда at Выдается команда, которая используется в качестве оболочки для выполнения команд или, если она не установлена, используется оболочка входа пользователя. Похоже, Ubuntu игнорирует это, хотя и предупреждает вас - warning: commands will be executed using /bin/sh, Разве вы не можете просто написать свои команды в файле и поставить шебанг на вершине?

#!/bin/bash
milk
sugar

затем запустите его как

at teatime -f script

Возможно, не совсем то, что вы хотите, но вы всегда можете заставить свой скрипт запускать оболочку, с выбранной вами оболочкой, нет?

Мне это не нравится, но один из обходных путей заключается в немедленном изменении строки 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. изменяет строку оболочки shebang самого нового файла в /var/spool/cron/atjobs/:

sudo <<< 'cd /var/spool/cron/atjobs/ && sed -i -e "1s/\#!\/bin\/sh/\#!\/bin\/bash/" $(ls -1t |head -n1)'

Может быть, состояние гонки в случае at now сам по себе интервал времени, если только искусственно не добавлено дополнительное время (например, 1 сек). Хотя в моих собственных случаях использования мне действительно нужно запустить его сейчас, а не через 1 секунду.

В любом случае, это слишком большой взлом системы, чтобы мне было удобно использовать мои скрипты.

Другие вопросы по тегам