Interação de script crontab estranha (bash)

2

Estou executando o Ubuntu 12.04 e o bash. Eu escrevi um par de scripts de shell que me permitem definir um alarme que, depois de tocar, não se ajusta. O primeiro, alarmset , permite que eu insira um horário e modifique a linha de alarme no meu usuário crontab. Essa linha lança o segundo script, alarmring , que inicia um player de rádio em uma janela do navegador e comenta a linha de alarme no crontab.

alarmring está se comportando de maneira estranha. Se eu mesmo executar diretamente, ele executa ambas as ações: ele inicia a janela do navegador e edita o crontab. Mas se eu executar alarmset , quando o crontab iniciar alarmring na hora marcada, alarmring editará o crontab, mas não iniciará a janela do navegador.

Finalmente, quando o crontab executa alarmring , ele ignora o comando set -x , enquanto quando eu o executo diretamente, set -x é executado. Então é como se o crontab estivesse pulando as dez primeiras linhas.

Alguma idéia do que está acontecendo? Vou colar os dois scripts e o crontab abaixo.

alarmset:

#!/bin/bash

# alarmset

set -x

usage()
{ echo "alarmset [ hour minute | -h ]" }

editcrontab() 
{ 
    echo $'/alarmring/s/^\(.*\)\(\* \* \*\)/'$2$' '$1$' \2/' > ~/Documents/crontab_script.txt 
    crontab -l | sed --file=/home/username/Documents/crontab_script.txt > ~/Documents/new_crontab.txt crontab ~/Documents/new_crontab.txt 
}

### MAIN 
case $# in 
    2 ) editcrontab $1 $2 ;; 
    * ) usage 
        exit ;; 
esac

set +x

alarmring:

#!/bin/bash

# alarmring

set -x

env DISPLAY=:0

# Ring the alarm : launch BBC World Service in Firefox 
firefox --new-window http://www.bbc.co.uk/radio/player/bbc_world_service

# Unset the alarm : comment out the alarm line in the crontab 
crontab -l | sed '/alarmring/s/^/#/1' > ~/Documents/new_crontab.txt 
crontab ~/Documents/new_crontab.txt

set +x

crontab:

SHELL=/bin/bash 
PATH=~/bin:/usr/bin:/bin 
# 
# m h dom mon dow command 
53 07 * * * /home/username/bin/alarmring
    
por Garrigus Carraig 06.04.2013 / 18:32

3 respostas

0

As entradas nos sistemas crontab ( /etc/crontab ) ou nos diretórios ( /etc/cron.d -ou- /etc/cron.hourly , etc.) são executadas como raiz. É provável que o root não tenha a capacidade de acessar a tela de um determinado usuário por padrão.

Eu sugeriria fazer entradas de crontab usando a capacidade do usuário de adicionar crontabs. Isso pode ser feito usando o comando crontab -e em um shell conectado como o usuário especificado.

O comando crontab -e abrirá um editor de texto (geralmente vi ou vim ) onde você poderá adicionar entradas usando a mesma sintaxe que você usaria para adicionar entradas ao arquivo /etc/crontab dos sistemas.

Este tutorial aborda o básico sobre como adicionar entradas de crontab .

Além disso, ao adicionar o crontab de um usuário via crontab -e e seu script precisar de acesso ao seu display (digamos que você está iniciando uma GUI), será necessário definir a variável de ambiente ( export DISPLAY=:0.0 ) para que a GUI obtenha direcionado para a exibição correta.

Por exemplo

% crontab -e

Adicione a seguinte linha:

53 07 * * * export DISPLAY=:0.0;/home/username/bin/alarming
    
por 06.04.2013 / 18:58
2

Para executar um programa de GUI, você precisa definir a variável de ambiente DISPLAY e, possivelmente, XAUTHORITY . Vejo Abrir um janela em um display X remoto (por que "Não é possível abrir a tela")? para obter mais informações.

~ significa que seu diretório home é um recurso de shell, você não pode usá-lo em um crontab. Pelo mesmo motivo, você não pode usar HOME . Use o caminho completo para seu diretório pessoal:

PATH=/home/username/bin:/usr/bin:/bin

Com o bash como seu shell, ~ realmente funciona, porque o bash expande ~ no valor de PATH . Mas isso é uma estranheza do bash, nenhum outro shell ou outro programa funciona dessa maneira.

O comando env DISPLAY=:0 exibe o ambiente atual, exceto com DISPLAY definido como :0 . Isso não é útil. Você supostamente quis dizer export DISPLAY=:0 .

Seu arranjo é muito complicado. O Cron é projetado para tarefas repetitivas. Se você deseja agendar um trabalho em segundo plano apenas uma vez, use em .

at 7:53 <<EOF
firefox --new-window http://www.bbc.co.uk/radio/player/bbc_world_service
EOF

Em mantém a variável de ambiente DISPLAY , portanto, desde que você execute o comando at na GUI onde deseja que o Firefox exiba uma janela, não é necessário configurá-lo manualmente.

    
por 08.04.2013 / 03:38
0
$ xauth extract - :0 | sudo xauth -f /root/.Xauthority merge -

Eles também correm de um tty diferente, então você precisa

$ DISPLAY=:0 xclock
    
por 06.11.2016 / 02:40