Executando .sh a cada 5 minutos

12

Eu tenho um script .sh que baixa uma foto do servidor de satélite japonês e a define como uma imagem de plano de fundo. Coloquei-o na lista de inicialização, mas como o executo a cada 5 minutos, automaticamente?

Aleksander Mahnyov
fonte
1
Experimente o cronmaker.com, onde você pode criar expressões cron e colocá-lo com o crontab -e #
Estamos no Borg
2
A imagem muda mesmo a cada 5 minutos? Tente usar um intervalo que crie menos carga desnecessária no servidor de destino. Ou faça o download apenas se o arquivo for realmente alterado.
til_b 24/02
1
A propósito, qual é o URL dos fundos espaciais?
21716 Bohdan_trotsenko #

Respostas:

14

A opção preguiçosa

Se você deseja o caminho mais fácil e evite descobrir qual variável de ambiente definir:

  • Verifique se o seu script inclui o shebang
  • Torne executável
  • Adicione o seguinte aos aplicativos de inicialização:

    /bin/bash -c "sleep 15 && while true; do <path_to_your_script.sh> ; sleep 300; done"

    Dash> Startup Applications> Add. Adicione o comando:

    /bin/bash -c "sleep 15 && while true; do <path_to_your_script.sh> ; sleep 300; done"

Explicação

Se você executar o script em seu próprio ambiente (por exemplo, em uma janela do terminal ou em Aplicativos de Inicialização), várias variáveis ​​de ambiente serão definidas. cronno entanto, executa seu script com um conjunto limitado de variáveis ​​de ambiente.
Como seu script, sem dúvida, usa o gsettingscomando:

gsettings get org.gnome.desktop.background picture-uri <wallpaper>

para definir o papel de parede, quase certamente o comando será interrompido quando for executado cron.

A desvantagem da "solução preguiçosa" é puramente teórica. Um comando que dorme praticamente continuamente não significa nada para o seu sistema.

Informação adicional; alternativamente

Lendo este post e de experiências anteriores, tenho certeza de que a DBUS_SESSION_BUS_ADDRESSvariável de ambiente precisa ser definida.

Para fazer isso, adicione a seguinte seção no início do seu script (abaixo do shebang):

PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)

Então, você poderá executá-lo com êxito cron.

No entanto, você pode muito bem salvar a agitação e escolher a opção preguiçosa.

Jacob Vlijm
fonte
@AleksanderMahnyov De nada. Ainda bem que funciona :)
Jacob Vlijm
2
É muito melhor usar um trabalho cron.
Luka Ramishvili 24/02
1
@LukaRamishvili Obrigado pelo comentário. No entanto: a. E por que isto? um comando de suspensão não significa nada para o seu sistema. b. Eu até incluí a opção.
Jacob Vlijm
1
Caso contrário, uma boa pesquisa sobre as variáveis ​​da sessão do gnome ajudaria muito o OP, pois isso seria necessário de qualquer maneira.
Luka Ramishvili 24/02
2
Eu apenas olhei: De cpu 0.0%que imposto estamos falando?
Jacob Vlijm
24

Coloque no seu crontab.

Abra sua cronmesa:

crontab -e

Agora adicione:

*/5 * * * * /path/to/script.sh

Não se esqueça de tornar o script executável antecipadamente.


Como seu script depende do X, provavelmente será uma boa ideia adicioná-lo DISPLAYao ambiente do script:

*/5 * * * * DISPLAY=:0 /path/to/script.sh

Substitua :0pelo seu real DISPLAY(pode ser encontrado echo $DISPLAYna sessão interativa).

Se necessário, você também pode adicionar a XAUTHORITYvariável de ambiente:

*/5 * * * * DISPLAY=:0 XAUTHORITY="~/.Xauthority" /path/to/script.sh

Mais uma vez, você pode encontrar o valor por echo $XAUTHORITY.

heemail
fonte
1
Não tenho certeza se ele funciona com variáveis de ambiente limitadas de cron, mas vamos ver se OP menciona ele funciona :)
Jacob Vlijm
1
@AleksanderMahnyov Por favor edite sua pergunta para adicionar o script, difícil dizer sem ver o contents..possibly um DISPLAY(e / ou XAUTHORITY) questão ..
heemayl
1
@Kartagis Cron não pode lidar com segundos, também você está tentando fazer por horas, o que ainda é sintaticamente errado ..
heemayl
2
Eu amo esse método, e não o "método preguiçoso", porque eu sabia sobre o cron, mas precisava de um curso de atualização. Foi exatamente isso que fiz, muito obrigado! :)
ZaxLofful
2
Melhor abordagem do que a resposta aceita. :)
Sandeep Kumar