Der Befehl "which" gibt nichts über cron zurück, funktioniert aber über die Konsole

1302
Juan Delgado

Ich habe ein kleines Hilfsprogramm in haXe + Neko geschrieben, das einige GIT-Befehle ausführen muss. Um zu vermeiden, dass der Pfad zur ausführbaren GIT-Datei hartcodiert wird, möchte ich mit dem Befehl which herausfinden, wo er sich befindet. Bei der manuellen Ausführung von der Konsole aus funktioniert alles wie erwartet, jedoch nicht, wenn die App auf einem Cron-Job ausgeführt wird.

Ich bin mir der eingeschränkten Umgebung bewusst ( hier oder hier ), wenn Sie ein Skript mit cron ausführen, aber immer noch überrascht, dass dies nicht funktioniert:

/usr/bin/which git >> /home/user/git.txt 

Die Textdatei wird erstellt, der Inhalt ist jedoch leer. Beim Ausführen von der Konsole aus funktioniert es wie erwartet.

Irgendwelche Ideen? Ich verwende OS X Leopard, wenn das hilft.

Vielen Dank : )

Juan

1

3 Antworten auf die Frage

3
Marnix A. van Ammers

Wenn 'which' die ausführbare Datei finden könnte, könnte dies auch der Shell-Interpreter sein, der den Befehl cron ausführt. Ich verstehe also nicht, warum Sie 'which' für diesen Zweck verwenden möchten. Aber vielleicht haben Sie einen Grund, der nicht offensichtlich ist.

Der Befehl "which" verwendet die in $ PATH aufgelisteten Verzeichnisse, um nach dem ersten Vorkommen eines Befehls zu suchen. Sehr wahrscheinlich ist PATH nicht so eingestellt, wie Sie glauben. Versuchen Sie, '/ usr / bin / env >> /home/user/you/env.txt' zu Ihrer Crontab hinzuzufügen, um heute eine Minute zu laufen. Dann schauen Sie in /home/user/you/env.txt nach, wo PATH eingestellt wurde. Wenn dieser PATH nicht für Ihre Zwecke geeignet ist, müssen Sie möglicherweise alle Ihre Befehle in ein kleines Shell-Skript schreiben, in dem Sie PATH selbst einstellen können. Sie können auch in dieser Datei env.txt nach anderen exportierten Umgebungsvariablen suchen, da dies von Nutzen sein kann, je nachdem, was Sie über Ihre Crontab-Software tun möchten.

Doh! Danke für den Hinweis auf den dummen Fehler. Juan Delgado vor 14 Jahren 0
2
Gordon Davisson

Where is git actually located (i.e. if you run /usr/bin/which git from the console, what does it print)? If it's not in a directory in $PATH (which is just /usr/bin and /bin on my Snow Leopard machine), /usr/bin/which won't find it, and you need to either hardcode it or add a line like

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

to the crontab file.

0
DarenW

Würde das den Trick tun?

/usr/bin/env git 

Der env-Befehl sorgt dafür, dass der Befehl gefunden wird, und befindet sich selbst immer in / usr / bin (so wurde mir gesagt ...). Dies ist ein üblicher Trick in Python-Skripten, der aufgrund unterschiedlicher Distro-Pythons an verschiedenen Orten erforderlich ist. aber niemand will herumstehen und versuchen zu finden, wo.

Das Problem ist, dass cron den PATH des Benutzers überschreibt. env hilft nur, wenn sich das Programm im PFAD befindet. Mikel vor 13 Jahren 0