Ich entschuldige mich, wenn dies schon einmal gefragt wurde, aber ich bin nicht sicher, wie ich eine Suchanfrage dazu stellen soll. Ich bin ein absoluter Neuling bei Linux und habe gelernt, Probleme nach und nach zu lösen.
Ich versuche, funktionierende Cron-Jobs einzurichten, um einen von mir betriebenen Spieleserver neu zu starten.
Derzeit sieht meine Crontab so aus
#backup world as instructed by https://github.com/g1franc/SEDS-Setup
0 0 * * * /home/root/spaceengineers/start.sh backupworld
#close server
1 0 * * * /usr/bin/screen -S spaceengineers -X stuff "^C"
#close screen
2 0 * * * /usr/bin/screen -S spaceengineers -X stuff "^M"
#recreate server
3 0 * * * /home/root/spaceengineers/start.sh
Jetzt auf der Backup-Welt bekomme ich in meiner Syslog-Datei befindet sich /var/log
ich
May 24 00:00:01 SpaceEngineers CRON[1958]: (root) CMD (/home/root/spaceengineers/start.sh backupworld)
May 24 00:00:01 SpaceEngineers CRON[1957]: (CRON) info (No MTA installed, discarding output)
und das ist auch das gleiche mit dem Recreate-Server
May 24 00:03:01 SpaceEngineers CRON[2269]: (root) CMD (/home/root/spaceengineers/start.sh /usr/bin/screen -x spaceengineers)
May 24 00:03:01 SpaceEngineers CRON[2268]: (CRON) info (No MTA installed, discarding output)
Die anderen Befehle funktionieren einwandfrei.
bevor jetzt jemand fragt, warum ich meinen Code so strukturiert habe, wie ich es getan habe, liegt es daran, dass das Tutorial, dem ich gefolgt bin, sagt, dass ich den Server über starten soll, ~/spaceengineers/start.sh -x spaceengineers
und von dem, was ich gelesen habe, muss ich /usr/bin/screen ausführen, um auf alle Bildschirmbefehle in Cron zuzugreifen
Was mache ich falsch und was muss ich tun, um meine Probleme zu beheben?
BEARBEITET:Habe die Crontab so geändert, dass sie mit den aktuellen Inhalten auf meinem Server übereinstimmt, die Probleme bleiben die gleichen
Pastebin von start.sh
Antwort1
Können Sie die GNU-Bildschirmsyntax für diese Zeile überprüfen:
3 0 * * * /home/root/spaceengineers/start.sh /usr/bin/screen -x spaceengineers
Ich hätte so etwas erwartet wie:
3 0 * * * /usr/bin/screen -S spaceengineers -X stuff 'command with newline'
-X
Die Verwendung des Mittels erfordert allerdings screen
die Ausführung von Bildschirmbefehlen und nicht die Ausführung eines Skripts.
Daher müssen Sie den screen
stuff
Befehl wie folgt verwendenSU-Frage
screen -S sessionname -X stuff 'command'`echo -ne '\015'`
Aktualisieren
Versuchen Sie es mit /bin/bash
oder wo auch immer sich die von Ihnen verwendete Shell befindet.
3 0 * * * /bin/bash /home/root/spaceengineers/start.sh
Fügen Sie möglicherweise Inhalte hinzu, start.sh
um die Fehlerbehebung zu unterstützen.
Sie können die Shell mit dem which
Befehl finden. Möglicherweise müssen Sie sudo
root sein, um das herauszufinden.
Antwort2
Dieser Befehl hat bei mir funktioniert. Da jedoch einer oder mehrere Befehle in meinem Skript sudo erforderten, musste ich dies unter dem Cron des Root-Benutzers einrichten:
17 2 29 1 * /usr/bin/screen -dmS $MYSESSIONNAME /bin/bash $FULLPATHTOMYSHELLSCRIPT $SHELLSCRIPTARG1 $SHELLSCRIPTARG2 ...
Der Schlüssel dazu, dass der Bildschirm funktioniert (und nicht einfach sofort geschlossen wird, wenn er von Cron aufgerufen wird), ist das -d
Argument, aber das m
hilft wahrscheinlich in gewisser Weise/in manchen Fällen auch.
Unten sehen Sie den entsprechenden Ausschnitt aus der screen --help
Ausgabe
-dmS name
Als Daemon starten: Bildschirmsitzung im getrennten Modus."
Antwort3
@daily /usr/bin/screen -dms aquaticscenery /ig.py && python ig.py