Executando 'screen' através de uma tarefa cron do @reboot

3

Eu quero ter um script sendo executado na tela na inicialização.

Isso não funciona:

@reboot pi screen -d -m /home/pi/db_update.py

no entanto, executando isso manualmente como o usuário pi funciona:

screen -d -m /home/pi/db_update.py

Alguma ideia do que eu sinto falta?

    
por Jrc 03.06.2013 / 09:41

4 respostas

4

Em vez de adicionar @reboot pi ... a /etc/crontab , você deve executar crontab -e como usuário pi e adicionar:

@reboot /usr/bin/screen -d -m /home/pi/db_update.py

Certifique-se de usar o caminho completo para a tela (só para ter certeza, funciona sem ele), e que o / home / pi não está em um sistema de arquivos criptografado (já passou por isso). O comando não pode depender de qualquer coisa que possa estar acessível somente após o daemon cron ter sido iniciado ou o usuário estar conectado.

Você pode querer adicionar algo a db_update.py (gravar em um arquivo em /var/tmp para ver se ele realmente é executado ou colocar um time.sleep (600) no final do programa python para permitir tempo suficiente para faça o login e conecte-se.

Testado no Lubuntu 13.04, python 2.7.4 com a seguinte entrada:

@reboot screen -d -m /home/anthon/countdown.py

e o countdown.py :

#!/usr/bin/env python
import time
for x in range(600,0,-1):
    print x
    time.sleep(1)

(e chmod 755 countdown.py )

    
por 03.06.2013 / 10:06
0

Embora isso possa ser uma solução alternativa, superei esse problema executando um script de shell que invoca minha sessão de tela.

[dude@server ~]$ crontab -l | grep sh
@reboot /home/dude/.autoscreen/start.sh
[dude@server ~]$ cat /home/dude/.autoscreen/start.sh
#!/bin/bash
cd ~
screen -S myname -d -m custom_script
    
por 03.06.2013 / 16:59
0

Eu tive um cenário de uso semelhante, mas ligeiramente diferente, para precisar de uma tela anexada a algo na inicialização. Eu tenho dois servidores sem cabeça, um dos quais tem saída somente serial. Eu tenho isso ligado ao outro servidor headless via cabo serial e eu precisava usar a tela para interagir através da conexão serial. Eu também preciso ter certeza de ter capturado qualquer saída gerada enquanto não estiver vendo a sessão serial.

Eu tenho isso no crontab da raiz

@reboot    /usr/bin/screen -d -m -c .screenrc -L /dev/ttyS0

O servidor reinicializa a uma hora do dia se as atualizações de segurança foram aplicadas. Eu quero arquivos de log especificamente nomeados para que eu possa revisá-los, se necessário. Meu arquivo .screenrc tem essa entrada

logfile "/root/.screen_%H_%Y%m%d_%c.txt"

para quando a próxima sessão de tela for iniciada, o arquivo de log estará em /home/root/.screen_$HOSTNAME_$YYYYMMDD_$h:$mm.txt .

    
por 01.04.2017 / 23:36
0

Existem algumas maneiras simples de descobrir o que está acontecendo com essa tela iniciada na inicialização:

  • começa mesmo? após a reinicialização, grep CRON /var/log/syslog deve retornar uma linha CMD para ela depois da linha que diz (CRON) INFO (Running @reboot jobs)

  • se ele for iniciado, mas a tela desaparecer quando você procurar, o comando será encerrado. Há várias maneiras de depurar isso, por exemplo:

    • executa um shell posteriormente para continuar a execução e você pode examinar a saída, conforme explicado em, e. link - screen ... -- sh -c "your command; exec sh"
    • execute o comando no script (1), por exemplo screen ... -- script -f yourcommand.boot.log -c "your command" e, em seguida, examine o arquivo de log

No meu caso, era um script que tentava se conectar ao banco de dados local do PostgreSQL, o que não era feito com a inicialização, e ele estava com uma mensagem de erro FATAL . Ou seja, estava tudo bem com cron e screen como tal, mas a combinação simplesmente correu muito cedo na sequência de inicialização da máquina.

Além disso, devo mencionar que você não precisa necessariamente mudar do arquivo crontab global ( /etc/crontab ) para o arquivo do usuário, existe um meio-termo na criação, por exemplo. /etc/cron/local-pi-whathaveyou com seu comando. Dessa forma, é óbvio para qualquer pessoa que examina /etc , mas você mantém seu usuário sem privilégios.

    
por 02.01.2018 / 16:04