Script não funciona no crontab

1

Eu tenho um script para iniciar meu servidor minecraft a cada reinicialização. Eu posso ver nos logs que está chamando o cmd, mas nenhuma tela está sendo aberta. Se eu trabalhar, execute o script manualmente, /home/minecraft/scripts/startMinecraft.shele funcionará perfeitamente.

Aqui está o meu crontab:

@reboot /home/minecraft/scripts/startMinecraft.sh
38 00,06,12,16 * * * /home/minecraft/scripts/backup.sh

É um servidor centos 6.

Aqui está o meu startMinecraft.shroteiro.

screen -A -m -d -S minecraftserver /home/minecraft/scripts/startServer.sh

Como eu disse antes, se eu executar essa linha exata manualmente, ela funcionará perfeitamente.

Austin
fonte

Respostas:

1

Provavelmente, você precisa definir o caminho completo para os binários, screenpois, quando o trabalho cron for executado, ele não terá os valores $ PATH definidos da mesma maneira que os de um usuário, quando você fizer login através do Terminal ou SSH. Esta resposta no Stack Overflow é uma explicação decente de todo o negócio.

Então, eu recomendo que você altere seu script a partir disso:

screen -A -m -d -S minecraftserver /home/minecraft/scripts/startServer.sh

Para isso:

/path/to/screen -A -m -d -S minecraftserver /home/minecraft/scripts/startServer.sh

E substitua /path/to/screenpelo caminho completo real que você pode obter facilmente usando o whichseguinte:

which screen

A saída seria algo como:

/usr/bin/screen

Ou você pode definir o $ PATH colocando-o no seu script assim:

PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

Obviamente, isso deve corresponder ao seu valor PATH real no seu sistema, que você pode obter digitando o seguinte:

echo $PATH

Mas eu pessoalmente prefiro o método fullpath, pois é mais limpo para mim e os valores $ PATH geralmente mudam para que você não deseje uma mistura de valores nos seus scripts Bash.

PS: Além disso, uma coisa pequena, mas seu script Bash deve ter o valor real do interpretador Bash definido no "shebang" na parte superior assim, para que seu script se pareça com o seguinte:

#!/bin/bash
/path/to/screen -A -m -d -S minecraftserver /home/minecraft/scripts/startServer.sh

Obviamente, isso /bin/bashdeve corresponder ao caminho real do Bash do sistema executando, which bashmas duvido que não esteja no /bin/bashcaminho de uma instalação moderna.

JakeGould
fonte
Alterei o script startMinecraft para #!/bin/bash /usr/bin/screen -A -m -d -S minecraftserver /home/minecraft/scripts/startServer.she, infelizmente, nenhuma alteração. Obrigado pela ajuda.
Austin
@ Austin Você é 100% positivo, todos os caminhos são iguais? Você pode executar o script manualmente a partir da linha de comando - executando ./startMinecraft.sh- sem problemas e o problema só aparece ao executá-lo por meio de um trabalho cron?
JakeGould
sim, usei o whichcomando para descobrir o caminho e executei manualmente o script e funcionou perfeitamente.
Austin
11
Tenho certeza que @JakeGould está na área certa com seus conselhos. Talvez haja outros aspectos do ambiente que minecraftele próprio precise (outras variáveis, $PATHentradas, outros serviços, etc.). Você pode colocar o script nos aplicativos de inicialização executados no logon, em vez de tentar usar crontabcom a @rebootlinha, o que eu não recomendaria para aplicativos da GUI. Você pode precisar precedê-lo bash -c.
AFH
11
@JakeGould O servidor minecraft não é daemonizado. Ele roda esse bom console, por isso screené útil tê-lo disponível .
21716 Karen B