Como uso o crontab para iniciar uma sessão de tela?

12

Eu quero criar uma entrada crontab para que ela inicie a tela, inicie um servidor de jogos e desanexe. Isso ocorre no caso de o servidor ser reiniciado e eu quero que ele seja iniciado automaticamente por mim.

0 0 0 0 0 (comando)

deve ser executado na inicialização.

Ele executa um arquivo shell localizado em ~ / cube / server.sh

Vencedor
fonte
Você é um usuário nesta máquina ou tem acesso aos scripts init?
Corey S.
2
Por favor, consulte Gerenciamento de Processo .
Pausado até novo aviso.
@ Dennis: Sim, eu gosto disso. Mas não podemos assumir que o servidor do jogo que ele está executando não possui algum tipo de console que ele precisa acessar (ou seja, sempre é executado em primeiro plano). Senão, por que ele se incomodaria com a tela? A menos, é claro, que ele não tenha conhecimento de nada de novo e de fundo.
Corey S.
Eu sou um usuário nesta máquina.
213 Victor Victor

Respostas:

15

Algo assim deve funcionar. Este exemplo gera uma tela e executa "top":

screen -d -m top

No seu crontab, como indicado, você deseja fazer algo assim:

@reboot /usr/bin/screen -dmS gameserver-screen /opt/mycoolgame/bin/gameserver

Obviamente, se o servidor do jogo exigir um conjunto de ambiente "normal", você poderá se aproximar:

@reboot (. ~/.profile; /usr/bin/screen -dmS gameserver-screen /opt/mycoolgame/bin/gameserver)
Corey S.
fonte
1
o que a . ~/.profilepeça faz?
213 Victor Victor
Ele define forçosamente o ambiente para a entrada cron. Sem ele, você apenas recebe algumas entradas muito específicas. (Veja man crontab para detalhes)
Corey S.
Eu tenho um arquivo .sh que executa o servidor do jogo, então isso funcionaria? @reboot (. ~/cube; /usr/bin/screen -dmS gameserver-screen ./server.sh)
213 Victor Victor
Essa é provavelmente a melhor maneira de fazer isso. Se isso funcionar, você provavelmente não precisará se preocupar com o perfil, mas se precisar de um $ PATH, etc, sempre poderá obter o perfil .profile no script server.sh.
Corey S.
5

Isso deve ser suficiente ... execute

$ crontab -e

Em seguida, digite:

@reboot screen -dmS Victor
atx
fonte
Você pode tentar explicar como esse comando 'Victor' se relaciona com a execução de um script - por exemplo, o script sobre o qual o OP perguntou?
28415 Patrick
1
-S é apenas para o nome da sessão
atx
4

Por uma questão de integridade, também é possível usar o tmux para esse fim, em vez de screen(veja este link para uma comparação):

@reboot tmux new-session -d -s yourNameOfTheSession "your command to run"
Petr Pudlák
fonte
0

Eu tive uma situação semelhante, mas devido a outras restrições irracionais, não pude usar o crontab. Na verdade, eu tinha tela de chamada inittab. (substituiu alguns nomes por informações obscuras):

XXX:5:respawn:/bin/su - useraccount -c "screen -D -m -c /home/xxxxxx/file.screenrc"

Em 'file.screenrc' é onde eu configuro algumas opções:

sessionname obscuresessionname
multiuser on
cd
screen /home/xxxxxxx/programtostart

Dessa forma, ele iniciava na inicialização e, se o programa morresse ou a tela fechasse, ele apareceria novamente. Pode não ter sido considerado convencional, mas tive que trabalhar alguns requisitos de ambiente estranhos. Se precisássemos derrubá-lo, teríamos que comentar essa linha e matar a sessão. Depois, quando estiver pronto para recuperá-lo, remova o comentário e inicie q.

mangloide
fonte