Script, usando notify-send, se recusa a executar a partir de aplicativos de inicialização

1

Eu quero rodar um script python que produza uma notificação de desktop no start-up no Ubuntu 12.04. Como posso fazer isso?

Eu tentei algumas maneiras comuns. Na inicialização do comando " ps aux

  • Meu script bash é essencialmente para executar um script Python que ecoa um comando do sistema.
  • Se eu iniciar manualmente o programa mais tarde, ele será executado corretamente.
import codecs
import time
import urllib2
import os
st = "NULL"
date = time.strftime("%d-%m")
try:
    st = urllib2.urlopen("XYZ.html").read()
except:
    pass
if st != "NULL":
    st.split("XYZ")[0].split("</table>")[0]
    if date in st:
        new = st.split(date)[1:]
        events = ""
        for j in new:
            events += (j.split("</td><td>")[1].split("</td></tr>")[0] + "\n")
        events = events[:-1]
    else:
        events = "Nothing special"
    to_send = "notify-send -i A/B/C.ico " + "'Calender " + date + "-2015' '" + events +"'"
    os.system(to_send)
else:
    to_send = "notify-send -i A/B/C.ico " + "'Calender " + date + "-2015' 'Check Internet connection'"
    os.system(to_send)
exit(0)
    
por PS Srinivasan 06.09.2015 / 07:50

1 resposta

1

Execução de comandos no login

Normalmente, é um desses casos em que um comando é interrompido se for executado muito em breve no processo de login. A área de trabalho ainda não está totalmente carregada e o comando não pode ser executado.

Adicione uma pausa aos seus aplicativos de inicialização antes que o script seja iniciado e ele será executado corretamente:

/bin/bash -c "sleep 15 && python2 /path/to/script.py"

Testei seu script com e sem o intervalo e, na verdade, falhei se o executei sem, mas consegui com o intervalo.

Algumas observações

  • Esteja ciente de que se você não usar o shebang ( #!/usr/bin/env python ) você deve preceder o caminho para o script por python para executá-lo. Não importa se é executável ou não.
  • Em sistemas mais lentos (ou em uma VM), o intervalo de 15 segundos pode não ser suficiente. Se assim for, tente começar com um intervalo relativamente longo, experimentando "abaixo" até o limite.

  • Sobre o roteiro; realmente não investiguei, mas eu definitivamente não usaria os.system mais, use subprocess.Popen() e, ah, você pode salvar uma linha removendo o primeiro os.system(to_send) e indentificando o segundo, já que você executará o comando nos dois casos após a rota if / else . :)

por Jacob Vlijm 10.09.2015 / 07:39