O trabalho Cron para executar o script python na reinicialização não funciona

4

Sou novo no Linux e li e segui muitas instruções para executar um script python na reinicialização, mas nenhuma delas funcionou:

este é o comando que quero executar:

/usr/bin/python3 /home/am/projects/AMAcc/map.py

Eu usei crontab -e e adicionei

@reboot /usr/bin/python3 /home/am/projects/AMAcc/map.py

Eu tentei sudo crontab -e e adicionei o mesmo comando

Eu até editei o arquivo /etc/crontab e adicionei o comando acima.

Tentei adicionar #!/usr/bin/python3 no topo do meu código python e alterar suas permissões como: sudo chmod a+x map.py

Como os documentos sugeriam que todos os usuários poderiam executar tarefas agendadas se o arquivo cron.deny existir, mas estiver vazio, tentei criar arquivos cron.deny vazios em /etc/cron.deny e /usr/lib/cron/cron.deny . Mas ainda não há sorte em executar o cron job.

O que estou fazendo?

    
por Ashkan Mobayen Khiabani 30.10.2017 / 07:01

1 resposta

4

Para executar qualquer aplicativo de GUI do Cron, você deve exportar algumas variáveis de ambiente de área de trabalho. Na maioria dos casos, é suficiente exportar o valor atual de $DISPLAY . Eu sugiro que você crie um script adicional de inicialização (bash), que irá lançar o seu aplicativo.

Em esta resposta é fornecida uma abordagem robusta de como encontrar e exportar o valor $DISPLAY do usuário atual. Mas há um problema. Enquanto o usuário não estiver conectado ao DE, o valor $DISPLAY não será definido. Então podemos adicionar uma condição adicional, como é feita em esta resposta :

# Get the value of the $DISPLAY variable for the current user. Unset it just in case this is a 'ssh -X' connection
unset DISPLAY;
while [ "$DISPLAY" == "" ]; do
        export DISPLAY=$(w "$USER" | awk 'NF > 7 &&  ~ /tty[0-9]+/ {print ; exit}' 2>/dev/null) && sleep 3
done
  • Essa condição funciona em todos os outros casos, mas falha em @reboot Cron jobs e não consigo descobrir o motivo. Assim, dentro do script abaixo é usada outra abordagem para verificar se o usuário está logado no Mate.

Alguns aplicativos precisam e poucas outras variáveis (por exemplo, veja este e respostas ) como $DBUS_SESSION_BUS_ADDRESS e $DESKTOP_SESSION . Na minha opinião, a melhor abordagem é encontrar o processo de sessão de desktop do usuário atual dentro do diretório /proc (processa o pseudo sistema de arquivos de informações) e exporta todas as variáveis do arquivo environ que está dentro de /proc/process-number .

Eu criei um pequeno projeto chamado cron-gui-launcher dedicado a isso. Funciona mas não é testado para todos os casos de usuários (como o atual). Aqui eu extraí a parte essencial que se refere ao Mate DE e fiz a modificação mencionada acima.

1. Crie um arquivo executável com este conteúdo:

#!/bin/bash -e

# Check whether the user is logged in Mate
while [ -z "$(pgrep mate-session -n -U $UID)" ]; do
        sleep 3 && count=$((count+1)) && echo "$count" > /tmp/mate-cron.log
done

# Get the content of the Current-Desktop-Session Environment File as an array:
EnvVarList='cat -e "/proc/$(pgrep mate-session -n -U $UID)/environ" | sed 's/\^@/\n/g''

# Export the Current-Desktop-Session Environment Variables:
for EnvVar in $EnvVarList; do
        echo "$EnvVar" >> /tmp/mate-cron.log
        export "$EnvVar"
done

# Execute the list of the input commands
nohup "" >/dev/null 2>&1 &

exit 0

2. Agora, em crontab use:

@reboot /path-to-the/script "your-application"

3. Notas:

  • Este script não funcionará com crontab da raiz. Por causa das variáveis $UID e $USER . Você poderia substituí-los com o UID e o NOME de determinado usuário.

  • Para outro DE, altere mate-session desta parte $(pgrep mate-session -n -U $UID) com o nome do processo do outro DE, por exemplo, gnome-session .

  • Talvez para aplicativos GUI, que são executados na inicialização do sistema, é melhor criar uma entrada em Aplicativos de inicialização . Para Mate DE: Control Centre > Personal > Startup Applications ( source ).

4. Aqui é apresentado como o script funciona:

    
por pa4080 30.10.2017 / 08:28