Meine Crontab:
* * * * * ~/d2gs.sh
Meine Bewerbung:
#!/bin/sh
#
# D2GS
#
# Go to the directory
cd ~
# Run the applications
if ! ps aux | pgrep "D2GS"; then
wine "C:/D2GS/D2GS.exe" > /dev/null 2>&1 &
fi
Die Crontab startet den Prozess nicht. Das ist seltsam, da ich ~/d2gs.sh manuell erfolgreich ausführen kann.
Antwort1
Sie müssen unterscheiden zwischen „die Crontab startet den Prozess nicht“ und „der Prozess startet zwar, tut aber nicht, was er soll“. Und stellen Sie sicher, dass die Datei ausführbar ist.
Anders als vermutet stellt die Verwendung von ~
in crontab
kein Problem dar. Der komplette Kommandostring wird an eine Shell übergeben.
Antwort2
Das cd ~
funktioniert möglicherweise nicht (daTilde-Erweiterungist nicht universell). Bevorzugen Sie cd $HOME
es (das garantiert für alle Implementierungen von ... dasselbe tut /bin/sh
) ..... Denken Sie daran, dass POSIX sh
(oder /bin/sh
) im Allgemeinennicht bash
(und Ihr System /bin/sh
ist möglicherweise nicht vollständig POSIX-kompatibel, sondern eher „Bourne“-ähnlich)!
Natürlich können Sie pwd > /dev/stderr
Ihrem Skript etwas wie hinzufügen (zu Debugging-Zwecken).
wine
braucht im Allgemeinen eineX11Server, um Fenster anzuzeigen. Und ein Programm, das von cron
einem X11-Server oder Terminal gestartet wird, funktioniert im Allgemeinen nicht. Daher wine
kann es wahrscheinlich nicht gestartet werden (von Ihrem cron
Job aus). Möglicherweise müssen Sie eine DISPLAY
Variable fürXlib. Sie können aber auch Xvfb verwenden, sieheHier.
Zu guter Letzt,pgrep(1)ist ein Scanvorgang. Entweder verwenden ps aux | grep "D2GS"
oder die Verwendung pgrep
selbst erlernen.
Ich empfehle die Verwendung echo something > /dev/stderr
oder besser echo
oderdrucken(1)(mit einem geeignetenUmleitung) oderlogger(1)in Ihrem Skript, zumindest zu Debugzwecken (an mehreren Stellen).
Und ich werde wine
-s stderr und stdout /dev/null
zumindest während der Debugging-Phase nicht umleiten. Kannst du nicht programmieren (zumindestvorübergehendwährend des Debuggens)
wine "C:/D2GS/D2GS.exe" >> /tmp/wine.out 2>&1
und untersuchen Sie es /tmp/wine.out
mit einem Pager wie less
?
Ihr cron
(und Ihr Shell-Skript) verwendet nicht Ihre interaktivePATH
VariableSie sollten erwägen, esausdrücklichin Ihrem Skript (oder crontab
). SieheUmgebung(7).