[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Cron jobs



Resolvi o problema em definitivo, vou compartilhar aqui para que fique
de referência futura.

Como dito, os scripts acionados pelo cron que façam uso do servidor X
precisam informar explicitamente as variáveis de ambiente DISPLAY e
XAUTHORITY.

No caso do DISPLAY, isto é trivial, basta escolher e informar. Normalmente:

export DISPLAY=:0

Se o display desejado for o do primeiro usuário conectado fisicamente à máquina.

Agora no caso do XAUTHORITY, o arquivo que garante o acesso pode
variar de acordo com o ambiente gráfico utilizado. Normalmente será o
"~/.Xauthority", de modo que basta um:

export XAUTHORITY=/home/$USER/.Xauthority

Mas no caso específico do gdm3, cada nova sessão cria um arquivo
randômico em /var/run/gdm3/auth-for-$USER-$HASH/database, o que nos
obriga a procurar pelo arquivo correto para a sessão específica.

No meu caso, eu resolvi o problema usando:

XAUTHFOLDER="`ls /var/run/gdm3/ | grep Debian`"
export XAUTHORITY=/var/run/gdm3/${XAUTHFOLDER}/database

Aproveitando que no Debian sempre haverá um arquivo do sistema,
independente de qual será o usuário conectado. Essa solução, contudo,
não serviria para qualquer distro.

Outras soluções que encontrei foram:

http://unix.stackexchange.com/questions/10121/open-a-window-on-a-remote-x-display-why-cannot-open-display

http://stackoverflow.com/questions/11015029/cron-job-how-to-run-a-script-that-requires-to-open-display

Abraços,

André Nunes Batista
Blog: http://tagesuhu.wordpress.com/
PGP Public Key: 0x7b0590cb6722cf80


2012/8/7 André Nunes <andrenbatista@gmail.com>:
> Consegui descobrir qual era o problema falando com o Javier
> Fernandez-Sanguino, mantenedor do pacote cron do debian.
>
> O script precisa acessar o servidor X e, para tanto, precisa do
> XAUTHORITY correto. Quando executado da linha de comando, o XAUTHORITY
> já está dado como variável do ambiente, mas quando é invocado pelo
> cron, o mesmo não acontece.
>
> Assim, para solucionar o problema é preciso atribuir explicitamente a
> variável XAUTHORITY no script. O grande problema agora é que o GMD3
> não usa o ~/.Xauthority, mas um arquivo aleatório dentro do
> /var/run/gdm3/*/database que é criado para cada nova sessão.
>
> Vou tentar criar um script que descubra o path correto para o
> xauthority da sessão, se alguém tiver experiência com bash scripting e
> quiser dar uma mão, serei extremamente grato. De qualquer forma, o
> problema com o cron já está resolvido e o script funcionando.
>
> Abraços,
>
> André Nunes Batista
> Blog: http://tagesuhu.wordpress.com/
> PGP Public Key: 0x7b0590cb6722cf80
>
>
> 2012/8/1 André Nunes <andrenbatista@gmail.com>:
>> Olá,
>>
>> Estou tentando, sem sucesso, agendar alguns scripts usando o cron e
>> gostaria de saber se alguém consegue me dar uma luz aqui.
>>
>> Um dos scripts é:
>>
>> ----------------
>>
>> #!/bin/bash
>> DATE="`date '+%Y%m%d_%H_%M'`"
>> export DISPLAY=:0
>> /usr/bin/import -window root -resize 800 /var/log/logkeys/ss/${DATE}.jpg
>>
>> ----------------
>>
>> O path para o script é: "/usr/local/bin/screen.sh"
>>
>> Permissões, usuário e grupo:   "-rwxr-xr-x 1 root staff"
>>
>>
>> O cron job é:
>>
>> --------------
>>
>> # Agendamento de printscreen a cada dois minutos.
>>
>> SHELL=/bin/sh
>> PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
>>
>> */2 * * * * root /usr/local/bin/screen.sh
>>
>> --------------
>>
>> O path é: /etc/cron.d/screen
>>
>> As permissões, usuário e grupo são:  "-rw-r--r-- 1 root root"
>>
>> O /var/log/syslog informa que o agendamento deu certo e o script está
>> sendo executado:
>>
>> ------------
>>
>> Aug  1 15:08:53 tagesuhu-pc dbus[1639]: [system] Successfully
>> activated service 'org.debian.apt'
>> Aug  1 15:08:54 tagesuhu-pc wpa_supplicant[1700]: wlan0: WPA: Group
>> rekeying completed with XXXXXXXXX [GTK=CCMP]
>> Aug  1 15:09:25 tagesuhu-pc wpa_supplicant[1700]: wlan0: WPA: Group
>> rekeying completed with XXXXXXXXXXXXX [GTK=CCMP]
>> Aug  1 15:09:56 tagesuhu-pc wpa_supplicant[1700]: wlan0: WPA: Group
>> rekeying completed with XXXXXXXXXXXX [GTK=CCMP]
>> Aug  1 15:10:01 tagesuhu-pc /USR/SBIN/CRON[22434]: (root) CMD
>> (/usr/local/bin/screen.sh)
>> Aug  1 15:10:27 tagesuhu-pc wpa_supplicant[1700]: wlan0: WPA: Group
>> rekeying completed with XXXXXXXXXXXX [GTK=CCMP]
>> Aug  1 15:10:58 tagesuhu-pc wpa_supplicant[1700]: wlan0: WPA: Group
>> rekeying completed with XXXXXXXXXXXXXXX [GTK=CCMP]
>> Aug  1 15:11:29 tagesuhu-pc wpa_supplicant[1700]: wlan0: WPA: Group
>> rekeying completed with XXXXXXXXXXXX [GTK=CCMP]
>> Aug  1 15:12:00 tagesuhu-pc wpa_supplicant[1700]: wlan0: WPA: Group
>> rekeying completed with XXXXXXXXXXXX [GTK=CCMP]
>> Aug  1 15:12:01 tagesuhu-pc /USR/SBIN/CRON[22449]: (root) CMD
>> (/usr/local/bin/screen.sh)
>> Aug  1 15:12:31 tagesuhu-pc wpa_supplicant[1700]: wlan0: WPA: Group
>> rekeying completed with XXXXXXXXXXXXX [GTK=CCMP]
>> Aug  1 15:13:02 tagesuhu-pc wpa_supplicant[1700]: wlan0: WPA: Group
>> rekeying completed with XXXXXXXXXXXXXXX [GTK=CCMP]
>> Aug  1 15:13:33 tagesuhu-pc wpa_supplicant[1700]: wlan0: WPA: Group
>> rekeying completed with XXXXXXXXXXXXXXXXXX [GTK=CCMP]
>> Aug  1 15:13:53 tagesuhu-pc AptDaemon: INFO: Quitting due to inactivity
>> Aug  1 15:13:53 tagesuhu-pc AptDaemon: INFO: Quitting was requested
>> Aug  1 15:14:01 tagesuhu-pc /USR/SBIN/CRON[22464]: (root) CMD
>> (/usr/local/bin/screen.sh)
>>
>> ------------
>>
>> No entanto, ao verificar o diretório /var/log/logkeys/ss/, nenhum
>> arquivo está sendo gravado.
>>
>> Testei o script diretamente do shell e ele funcionou normalmente. Além
>> disso, os outros dois scripts também não estão sendo executados pelo
>> cron, de modo que eu acredito que há algum problema na forma como eu
>> agendei a sua execução, só não consigo entender qual é o problema.
>>
>> Obs: Não possuo nem o arquivo cron.allow nem o arquivo cron.deny.
>>
>> André Nunes Batista
>> Blog: http://tagesuhu.wordpress.com/
>> PGP Public Key: 0x7b0590cb6722cf80


Reply to: