mudando o shell padrão para / bin / bash no job scheduler como no CRON

1

Existe uma maneira de alterar o shell inicial usado pelo serviço de agendamento de trabalhos atd ? Esp. no Ubuntu.

Por padrão,

at usa /bin/sh em todos os produtos Linux e Solaris nos quais eu implantei produtos.

O crontab do GNU dá a você a opção de definir SHELL=/bin/bash como padrão para entradas que são inline / não chamam um script com a própria linha shebang.

Estou ciente de que é possível fazer

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

mas tais soluções alternativas representam outros problemas.

    
por Marcos 05.03.2012 / 18:55

3 respostas

2

Para o CentOS e relacionado à variável de ambiente SHELL é lido quando o comando at é emitido e isso é usado como o shell para executar os comandos ou, se não estiver configurado, o shell de login do usuário é usado. Parece que o Ubuntu ignora isso, embora avise você - warning: commands will be executed using /bin/sh . Você não pode simplesmente escrever seus comandos em um arquivo e colocar uma shebang no topo?

#!/bin/bash
milk
sugar

depois, execute-o como

at teatime -f script
    
por 05.03.2012 / 19:30
0

Não é exatamente o que você quer, mas você sempre pode fazer com que o seu trabalho execute um shell script, com o shell de sua escolha, não?

    
por 05.03.2012 / 18:57
0

Eu não gosto, mas uma solução é modificar imediatamente a linha 1 do trabalho recém-spool.

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
...

Então, essa estratégia seria escrever um wrapper em cima de at que

  1. intercepta seu $ jobid quando at é executado abaixo Não é necessário
  2. altera a linha de shell shebang do arquivo mais recente em / var / spool / cron / atjobs /:

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

Pode ser uma condição de corrida no caso do intervalo de tempo at now por si mesmo, a menos que talvez um tempo adicional (como 1 segundo) seja adicionado artificialmente. Embora em meus próprios casos de uso, eu realmente precise que ele seja executado agora não em 1 segundo.

De qualquer forma, esse é um sistema muito hack para fazer com que meus scripts usem confortavelmente.

    
por 10.03.2012 / 22:11

Tags