Изменение оболочки по умолчанию на /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
тот
-
перехватывает его $jobid, когдаat
Неработает подНе нужно - изменяет строку оболочки 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 секунду.
В любом случае, это слишком большой взлом системы, чтобы мне было удобно использовать мои скрипты.