Comment utiliser crontab pour démarrer une session écran?

12

Je veux créer une entrée crontab pour qu'elle démarre l'écran, démarre un serveur de jeux et se détache. C'est pour le cas où le serveur est redémarré et je veux qu'il démarre automatiquement pour moi.

0 0 0 0 0 (commande)

devrait s'exécuter au démarrage.

Il exécute un fichier shell situé à ~ / cube / server.sh

Victor
la source
Êtes-vous un utilisateur de cette machine ou avez-vous accès aux scripts d'initialisation?
Corey S.
2
Veuillez consulter Gestion des processus .
pause jusqu'à nouvel ordre.
@ Dennis: Oui, j'aime ça. Mais nous ne pouvons pas supposer que le serveur de jeu qu'il exécute n'a pas une sorte de console à laquelle il aurait besoin d'accéder (c'est-à-dire qu'il fonctionne toujours au premier plan). Sinon, pourquoi s'embêter avec l'écran? Sauf bien sûr, il n'est pas au courant du nohup et des antécédents.
Corey S.
Je suis un utilisateur de cette machine.
Victor

Réponses:

15

Quelque chose comme ça devrait fonctionner. Cet exemple génère un écran et exécute "top":

screen -d -m top

Dans votre crontab, comme indiqué, vous voudriez faire quelque chose comme ceci:

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

Bien sûr, si le serveur de jeu nécessite un ensemble d'environnement "normal", vous pouvez vous rapprocher en:

@reboot (. ~/.profile; /usr/bin/screen -dmS gameserver-screen /opt/mycoolgame/bin/gameserver)
Corey S.
la source
1
que fait la . ~/.profilepièce?
Victor
Il définit de force l'environnement pour l'entrée cron. Sans cela, vous obtenez juste quelques entrées très spécifiques. (Voir man crontab pour plus de détails)
Corey S.
J'ai un fichier .sh qui exécute le serveur de jeu, alors cela fonctionnerait-il? @reboot (. ~/cube; /usr/bin/screen -dmS gameserver-screen ./server.sh)
Victor
C'est probablement la meilleure façon de procéder. Si cela fonctionne, vous n'aurez probablement pas à vous soucier du profil, mais si vous avez besoin d'un $ PATH complet, etc., vous pouvez toujours source dans le .profile à partir du script server.sh.
Corey S.
5

Cela devrait être suffisant ... exécuter

$ crontab -e

Entrez ensuite:

@reboot screen -dmS Victor
atx
la source
Pouvez-vous s'il vous plaît essayer d'expliquer comment cette commande «Victor» se rapporte à l'exécution d'un script - par exemple le script que l'OP a demandé?
Patrick
1
-S est juste pour le nom de la session
atx
4

Par souci d'exhaustivité, il est également possible d'utiliser tmux à la place de screen(voir ce lien pour une comparaison):

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

J'ai eu une situation similaire, mais en raison d'autres restrictions déraisonnables, je n'ai pas pu utiliser crontab. J'avais en fait un écran d'appel inittab. (remplacé certains noms pour masquer les informations):

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

Dans 'file.screenrc', j'installe quelques options:

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

De cette façon, il a commencé au démarrage, et si le programme mourait ou que l'écran se fermait, il réapparaissait. Il n'était peut-être pas considéré comme conventionnel, mais j'ai dû contourner quelques exigences d'environnement étranges. Si nous avions besoin de le supprimer, nous devions commenter cette ligne et tuer la session. Ensuite, lorsque vous êtes prêt à le réactiver, supprimez le commentaire et init q.

mangloide
la source