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
- Melhor versão do scrip: Como posso mostrar mensagens de envio de notificação acionadas pelo crontab?
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: