Se executado como um cronjob, meu script de shell não inicia uma tela

Se executado como um cronjob, meu script de shell não inicia uma tela

Por favor, dê uma olhada no seguinte script de shell simples startCleanup.sh:

#!/bin/sh
screen -d -m -S cleaner /usr/bin/python3 /opt/cleanup.py 

Meu crontab está assim:

* * * * * /opt/startCleanup.sh > /opt/cleanup.log 2>&1

Quando executo este script no shell como um usuário conectado normalmente, não tenho problemas. No entanto, se eu executar isso como um cronjob normal, nenhuma tela será iniciada. Ou melhor dizendo: A tela é iniciada (eu acho) mas quando o script termina e junto com o script a tela também é encerrada.

Alguém tem uma idéia de como resolver esse problema?

obrigado :)

ATUALIZAÇÃO: Ok, agora eu definitivamente sei que a tela foi executada corretamente (verifiquei isso adicionando um sleep no final do script bash).

Então eis o que acontece: A tela é criada. MAS quando o script bash termina, a tela também é encerrada. Então, a tela ainda depende do script.

Como posso evitar que a tela seja encerrada quando o script terminar?

Responder1

você já tentou algo assim?

#!/bin/sh
screen -D -R cleaner /usr/bin/python3 /opt/cleanup.py

Esta combinação de parâmetros tentará reconectar-se a uma sessão, se existir, ou criar, se não existir, de acordo com a página de manual.

Além disso, não acho que haverá nenhuma saída redirecionada para o arquivo, exceto quaisquer erros que ocorram ao chamar a tela.

Responder2

na verdade, usar screen aqui não parece fazer muito sentido. Mas verifiquei sua solução na minha caixa e funciona bem. A sessão de tela é iniciada a partir do script iniciado no cronjob e posso anexar a ele. Experimente algumas coisas:

  1. adicione o caminho completo para a tela no script startCleanup.sh
  2. observe /var/log/cron se os jobs forem iniciados
  3. redirecione a saída de /usr/bin/python3 /opt/cleanup.py para o arquivo e verifique se funciona bem quando iniciado através do cron

Responder3

estou enfrentando um problema semelhante ao seu, acionar manualmente o arquivo sh está totalmente correto. mas no cronjob ele não executa o processo da tela, esse é meu código original do arquivo sh

#!/bin/bash
bash -c "python GetCookie.py"
wait

export DISPLAY=:0
Respond=`screen -ls`

if [[ $Respond != *"UploadImage"* ]]; then

    screen -dmS myAction bash -c " cd ~/DirectoryName ; /usr/bin/php7.4 index.php bag 1"

else
    echo "NOPEEEE"
fi

o log do cronjob mostrou que acionou o trabalho. mas emtela -lsnão mostra nenhum processo em andamento.

o que eu fiz foi mudar

screen -dmS myAction bash -c " cd ~/DirectoryName ; /usr/bin/php7.4 index.php bag 1"

para

screen -d -m -S myAction bash -c " cd ~/DirectoryName ; /usr/bin/php7.4 index.php bag 1"

e meu problema foi resolvido.

informação relacionada