Como executar um cronjob no meu ambiente regular?

5

As variáveis shell e ambiente nas quais os cronjobs são executados são completamente diferentes das variáveis apresentadas em gnome-terminal . Como posso executar um cronjob sob as mesmas circunstâncias como se eu tivesse executado no terminal?

Minha solução atual está executando o cronjob env DISPLAY=:0.0 gnome-terminal -e my-command , mas isso mostra um terminal gnome, o que não é realmente aceitável.

    
por Gilles 17.09.2011 / 12:29

2 respostas

4

Você pode especificar explicitamente as variáveis de ambiente desejadas na parte superior de seu crontab ou pode originar seu ambiente de algum lugar.

Para adicionar variáveis de ambiente explicitamente, você pode usar uma linha como esta no topo do seu script (depois do hashbang):

FOO=bar

Para obtê-los de um arquivo, use uma linha como esta:

. /foo/bar/baz

Em resposta à sua edição da sua pergunta para incluir gpg-agent , você poderá obter ~/.gpg-agent-info para obter $GPG_AGENT_INFO . Se não existir, tente iniciar gpg-agent com --write-env-file "${HOME}/.gpg-agent-info" .

    
por 17.09.2011 / 12:35
1

Você está certo de que os processos não devem ser capazes de espiar outros ambientes de processo. Isso é muito por design. Mas, export empacotará seu ambiente para ser escolhido por outra coisa.

O que você pode fazer é algo assim em seu .bashrc:

[[ $DISPLAY ]] && export > ~/.cron_bread_crumbs/gonme_env

Em seguida, o seu cron pode simplesmente buscá-lo.

. /home/user/.cron_bread_crumbs/gnome_env

O arquivo estará cheio de linhas como esta:

declare -x ENV_VARIABLE="value"

Os valores serão, obviamente, citados. Foi o que eu quis dizer ao dizer "embalado com cuidado".

O fornecimento (chamando declare -x , que é uma exportação) significa que todos os processos subseqüentes que são iniciados (e talvez desanexados) do cron pai também herdarão esses valores.

Isso é um pouco desajeitado, porque assume que você abriu um terminal do gnome fazendo com que os valores sejam atualizados antes do cron rodar. Um pouco de sanidade no cron job não deve ser muito difícil de adicionar, no entanto.

Sua outra opção é iniciar algo em segundo plano que bloqueia apenas enquanto despeja o ambiente em um canal nomeado e, em seguida, permite que o trabalho cron o obtenha a partir daí. De qualquer maneira, o kludge está em garantir que algo aconteça via terminal Gnome, para que o cron job receba as variáveis.

    
por 17.09.2011 / 13:51