Linux crontab - qual shell estou usando

0

No crontab, como eu sei qual shell está usando?

por exemplo, se eu quiser redirecionar a saída, como sei se preciso usar & > ou > & (bash vs csh)

    
por CodeNoob 14.03.2017 / 15:16

2 respostas

8

De crontab(5) :

Several environment variables are set up automatically by the cron(8) daemon. SHELL is set to /bin/sh, and LOGNAME and HOME are set from the /etc/passwd line of the crontab´s owner. HOME and SHELL can be overridden by settings in the crontab; LOGNAME can not.

    
por 14.03.2017 / 15:28
3

Depende de qual versão de cron você tem e de como ela está configurada, mas geralmente é /bin/sh . Muitas vezes, isso é um link simbólico para outra coisa, mas é fácil encontrá-lo, já que você pode simplesmente executar ls -l /bin/sh .

Você pode adicionar uma entrada do cron como:

* *    * * *    ps -p $$ > /tmp/shelltest

ou (se editar /etc/crontab em vez de adicionar uma entrada a um crontab por usuário como feito via crontab -e ):

* *    * * *    username    ps -p $$ > /tmp/shelltest

, que informará via saída para /tmp/shelltest o nome do arquivo do shell. Se o seu cron estiver configurado corretamente para enviar a saída para você, você poderá pular o >/tmp/shelltest para obter as informações por e-mail, em vez de elas serem colocadas em um arquivo.

Para ser um pouco mais trixy algo como:

* *    * * *    ls -l /proc/'ps -p $$ | tail -n 1 | xargs | cut -f 1 -d \ '/exe > /tmp/shelltest

deve informar o arquivo exato usado. Em um sistema Debian típico, isso resultará em algo como:

lrwxrwxrwx 1 dspillett dspillett 0 Mar 14 16:17 /proc/1356/exe -> /bin/dash

mostrando que o cron está usando dash como o shell padrão nesta instância.

Para anular esse comando:

  • ps -p $$ exibe detalhes do processo atual (bem,% processo pai ps ) que será o shell neste caso.
  • tail -n 1 retira a linha do cabeçalho que ps inclui
  • percorrer xargs é um truque para aparar os espaços iniciais da linha
  • a invocação de cut pega o primeiro campo do like onde o delimitador é espaços (é absolutamente vital incluir o espaço entre o \ e o backtick)
  • agrupar isso nos backticks inclui a saída (que deve ser um ID do processo) na linha de comandos externa que se torna ...
  • ls -l /proc/9999/exe em que "9999" é a ID do processo lida de ps , que lista o arquivo usado para criar o processo, porque no sistema de arquivos '/ proc' /proc/<pid>/exe é um link para o executável do processo identificado por < pid & gt .
  • (pode haver uma maneira mais concisa de fazer a mesma coisa, que foi digitada da memória, sugestões bem-vindas via comentários!)
por 14.03.2017 / 17:37