Executando um aplicativo X a partir de um script de shell via temporizador systemd

1

Estou tentando criar um timer do systemd (usuário) que abre determinadas guias todos os dias às 21h com xdg-open . Aqui estão os arquivos:

/home/me/.config/systemd/user/test.service

[Unit]
Description=Test

[Service]
Type=simple
Environment=DISPLAY=:0
ExecStart=/bin/bash /home/me/test.sh

/home/me/.config/systemd/user/test.timer

[Unit]
Description=Test Timer
RefuseManualStart=no
RefuseManualStop=no

[Timer]
Persistent=true
OnCalendar=*-*-* 21:00:00

[Install]
WantedBy=timers.target

/home/me/test.sh

#!/bin/bash


websites=(
    "http://unix.stackexchange.com/"
    "http://stackoverflow.com/"
)

for i in "${websites[@]}"
do
    # works with /usr/bin/firefox
    /usr/bin/xdg-open "$i"
done

Isso não abre nada.

Quando eu substituo xdg-open por firefox no arquivo acima, as guias são abertas. No entanto, quando executo o xdg-open "http://unix.stackexchange.com/" em um terminal, ele abre uma aba no Firefox.

systemctl --user start test.service 
systemctl --user status test.service 

impressões:

● test.service - Test
   Loaded: loaded (/home/me/.config/systemd/user/test.service; static; vendor preset: enabled)
   Active: inactive (dead)

Jun 29 15:06:59 me-PC systemd[1513]: Started Test.

Como posso fazer com que este timer funcione com xdg-open ?

    
por Joschua 29.06.2016 / 15:23

1 resposta

2

Geralmente, as diferenças entre executar um script manualmente e executá-lo via systemd são diferenças devidas no ambiente. Antes da chamada xdg-open , adicione o comando env em sua própria linha, que despeja o ambiente.

Agora, execute o teste manualmente e via systemd . Procure outras variáveis além de DISPLAY que possam estar causando a diferença. Ao continuar adicionando variáveis de ambiente no script systemd , você poderá encontrar as que o systemd precisa para fazer isso funcionar.

Seu código bash no seu teste parece bem, mas aqui está uma revisão que é um pouco mais idiomática se você estiver interessado. bash naturalmente divide no espaço e URLs não contêm espaço, portanto, esse código alternativo funciona. Eu também substituí o do/done por chaves:

websites="
    http://unix.stackexchange.com/
    http://stackoverflow.com/"

for i in $websites; {
    # works with /usr/bin/firefox
  /usr/bin/xdg-open "$i"
}
    
por 29.06.2016 / 16:06