Aplicação fecha sozinha (jogo 7 Days to Die)

Iniciado por fernando_pinhal, 13 de Fevereiro de 2016, 15:26

tópico anterior - próximo tópico

fernando_pinhal

Olá, aluguei uma VPS com 3 gb de RAM para hospedar um jogo, o 7 days to Die, e estou notando que o meu servidor anda fechando sozinho. Acredito que deve ter como existir o que eu quero pois dá para fazer quase tudo no linux, então vamos lá:

1 - Tem como eu agendar um cron, para checar se o processo está rodando, e caso não esteja rodando, ele iniciar a aplicação? Para instalar o jogo, eu instalei ele por um bootstrat, e digito sempre "sudo 7dtd.sh Start Servidor", esse comando acho que faz um screen e inicia o servidor pois eu posso continuar a usar o SSH.

2 - Essa aplicação, tem como eu agendar para o servidor sempre iniciar quando iniciar a VPS?

Obrigado pelo apoio.

zekkerj

Citação de: fernando_pinhal online 13 de Fevereiro de 2016, 15:26
Olá, aluguei uma VPS com 3 gb de RAM para hospedar um jogo, o 7 days to Die, e estou notando que o meu servidor anda fechando sozinho. Acredito que deve ter como existir o que eu quero pois dá para fazer quase tudo no linux, então vamos lá:

1 - Tem como eu agendar um cron, para checar se o processo está rodando, e caso não esteja rodando, ele iniciar a aplicação? Para instalar o jogo, eu instalei ele por um bootstrat, e digito sempre "sudo 7dtd.sh Start Servidor", esse comando acho que faz um screen e inicia o servidor pois eu posso continuar a usar o SSH.
Bem, claro que tem, mas vc precisa saber quais os processos a serem executados...

Citar2 - Essa aplicação, tem como eu agendar para o servidor sempre iniciar quando iniciar a VPS?
Novamente, a resposta é sim. E novamente, vc precisa descobrir qual o comando a ser agendado.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

fernando_pinhal

zekkerj?

Sou um entusiasta mas meu conhecimento de Linux é muito ridículo. Como consigo essas informações que você pediu? Copio e colo o resultado de um htop aqui? De verdade, o comando que eu uso para iniciar a instância é aquele que eu informei antes.

zekkerj

Há algum fórum ou site especializado no jogo?
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

ricardofantin

Espero que você saiba programar para adaptar o código que eu estou postando aqui.

Uma das possíveis causas da aplicação fechar é da comunicação por SSH cair. Para resolver isso mude o comando de "sudo 7dtd.sh Start Servidor" para "sudo nohup 7dtd.sh Start Servidor". Desta forma mesmo se o SSH cair o jogo não vai fechar (ver man nohup).

No cron você deve chamar um script para testar se o programa está rodando. No arquivo /etc/crontab adicione a seguinte linha "* * * * * root /caminho_para_o_script". Desta forma o cron vai chamar o script uma vez por minuto.

Por fim precisa fazer o script. Vamos por partes. Primeiro precisamos de um comando que verifique se o serviço está rodando, o comando é "ps a | grep "sudo nohup 7dtd.sh Start Servidor" | wc -l > ehdois.txt". Esse comando exibe os processos rodando (ps a), seleciona apenas as linhas que tem a string "sudo nohup 7dtd.sh Start Servidor" (grep ...), conta as linhas (wc -l) e coloca o resultado no arquivo ehdois.txt. Por fim deve-se comparar o resultado do arquivo ehdois.txt para ver se ele tem como conteúdo o número 2, para isso crie um arquivo chamado dois.txt (echo "2" > dois.txt) e compare para ver se tem diferença nos arquivos (diff ehdois.txt dois.txt). Note que o número 1 no arquivo significa apenas o comando grep procurando a string específica, o resultado 2 significa o grep e o serviço rodando (rode o comando "ps a" com o serviço rodando para entender melhor).
Vamos finalmente para o script:
#!/bin/bash

diferenca=$(diff dois.txt ehdois.txt)

if [ $diferenca -ne 0 ] then
   sudo nohup 7dtd.sh Start Servidor


Eu não testei todo o processo. Mas deve funcionar. Uma parte que pode possivelmente não funcionar é o comando ps a, talvez você deva usar o comando ps ax para exibir todos os processos. Outra coisa, talvez o processo não seja encontrado pelo comando do script e você precise saber o nome do processo exato, para isso use o comando ps ax e encontre o processo desejado.

Se precisar de mais ajuda poste aqui que eu detalho mais.

fernando_pinhal

Antes de mais nada, obrigado aos dois, mas especialmente para você Ricardo, pois acho que você sacou a raiz do problema. Bom, vamos por partes. Posto o que que você pediu para eu fazer, e o que eu fiz:

Citação de: ricardofantin online 14 de Fevereiro de 2016, 19:29
Espero que você saiba programar para adaptar o código que eu estou postando aqui.

Uma das possíveis causas da aplicação fechar é da comunicação por SSH cair. Para resolver isso mude o comando de "sudo 7dtd.sh Start Servidor" para "sudo nohup 7dtd.sh Start Servidor". Desta forma mesmo se o SSH cair o jogo não vai fechar (ver man nohup).

Testei no terminal e deu os seguintes resultados:


root@vps56aac3f177d23:~# sudo nohup 7dtd.sh Start Servidor
nohup: ignoring input and appending output to 'nohup.out'
root@vps56aac3f177d23:~# sudo 7dtd.sh Status Servidor
Instance: Servidor

Status: Running
Open ports:

/* Omitido por segurança */

/usr/local/lib/7dtd/common.sh: line 195: nc: command not found
Players:

Game info:
    Server name:    BR - Walking Dead (novo host/Sem Dogs/PvE)
    Password:
    Max players:    10
    World:          Random Gen

/* Omitido */

root@vps56aac3f177d23:~#



Depois tentei fazer o comando que você informou:

Citação de: ricardofantin online 14 de Fevereiro de 2016, 19:29

No cron você deve chamar um script para testar se o programa está rodando. No arquivo /etc/crontab adicione a seguinte linha "* * * * * root /caminho_para_o_script". Desta forma o cron vai chamar o script uma vez por minuto.

Por fim precisa fazer o script. Vamos por partes. Primeiro precisamos de um comando que verifique se o serviço está rodando, o comando é "ps a | grep "sudo nohup 7dtd.sh Start Servidor" | wc -l > ehdois.txt". Esse comando exibe os processos rodando (ps a), seleciona apenas as linhas que tem a string "sudo nohup 7dtd.sh Start Servidor" (grep ...), conta as linhas (wc -l) e coloca o resultado no arquivo ehdois.txt. Por fim deve-se comparar o resultado do arquivo ehdois.txt para ver se ele tem como conteúdo o número 2, para isso crie um arquivo chamado dois.txt (echo "2" > dois.txt) e compare para ver se tem diferença nos arquivos (diff ehdois.txt dois.txt). Note que o número 1 no arquivo significa apenas o comando grep procurando a string específica, o resultado 2 significa o grep e o serviço rodando (rode o comando "ps a" com o serviço rodando para entender melhor).

Vamos finalmente para o script:
#!/bin/bash

diferenca=$(diff dois.txt ehdois.txt)

if [ $diferenca -ne 0 ] then
   sudo nohup 7dtd.sh Start Servidor


Eu não testei todo o processo. Mas deve funcionar. Uma parte que pode possivelmente não funcionar é o comando ps a, talvez você deva usar o comando ps ax para exibir todos os processos. Outra coisa, talvez o processo não seja encontrado pelo comando do script e você precise saber o nome do processo exato, para isso use o comando ps ax e encontre o processo desejado.

Se precisar de mais ajuda poste aqui que eu detalho mais.

No caso digitei os seguintes comandos sem erro no terminal:

root@vps56aac3f177d23:~# ps a | grep "sudo nohup 7dtd.sh Start Servidor" | wc -l > ehdois.txt
root@vps56aac3f177d23:~# echo "2" > dois.txt

Mas, usei um ps ax para ver os processos e lembrei que ele na verdade chama um outro script para iniciar o jogo:


root@vps56aac3f177d23:~# ps a | grep "sudo nohup 7dtd.sh Start Servidor"
root@vps56aac3f177d23:~# ps a
  PID TTY      STAT   TIME COMMAND
1668 tty2     Ss+    0:00 /sbin/getty 38400 tty2
1669 tty1     Ss+    0:00 /sbin/getty 38400 console
5808 pts/0    Ss+    0:00 -bash
15390 pts/3    Ss     0:00 -bash
26052 pts/3    R+     0:00 ps a
root@vps56aac3f177d23:~# ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 init
    2 ?        S      0:00 [kthreadd/100933]
    3 ?        S      0:00 [khelper/100933]
  197 ?        Ss     0:00 /lib/systemd/systemd-udevd --daemon
  459 ?        Ss     0:00 /usr/sbin/xinetd -dontfork -pidfile /var/run/xinetd.p
  462 ?        Ss     0:00 /usr/sbin/sshd -D
  480 ?        Ss     0:01 cron
1668 tty2     Ss+    0:00 /sbin/getty 38400 tty2
1669 tty1     Ss+    0:00 /sbin/getty 38400 console
5797 ?        Ss     0:00 sshd: root@pts/0
5808 pts/0    Ss+    0:00 -bash
11385 ?        Ss     0:00 sshd: root@notty
11396 ?        Ss     0:00 /usr/lib/openssh/sftp-server
15299 ?        Ss     0:00 sshd: root@pts/3
15390 pts/3    Ss     0:00 -bash
[u][b]21225 ?        Sl     0:54 /home/sdtd/engine/7DaysToDieServer.x86 -logfile /home[/b][/u]
21263 ?        S      0:00 /bin/bash /usr/local/lib/7dtd/monitor-log.sh Servidor
21299 ?        S      0:00 tail -n 5000 -F /home/sdtd/instances/Servidor/logs/20
21300 ?        S      0:00 tr \\ /
21301 ?        S      0:00 tr -d \r
21302 ?        S      0:00 grep -v ^(Filename:
21303 ?        S      0:00 sed -r s/^[0-9]+-[0-9]+-[0-9]+T[0-9]+:[0-9]+:[0-9]+ [
21304 ?        S      0:00 /bin/bash /usr/local/lib/7dtd/monitor-log.sh Servidor
26054 pts/3    R+     0:00 ps ax
31863 ?        S      0:00 /home/sdtd/engine/7DaysToDieServer.x86 -logfile /home


Esse é o processo que faz iniciar o jogo:

21225 ?        Sl     0:54 /home/sdtd/engine/7DaysToDieServer.x86 -logfile /home

Para completar, a saída do ehdois.txt, deu 1 no meu servidor.