at Befehl. Wie?

M

matzh

Mitglied
Thread Starter
Dabei seit
03.07.2005
Beiträge
22
Reaktionspunkte
0
Entweder ich stehe irgendwie völlig auf der Leitung oder es funktioniert wirklich nicht.
Ich möchte dynamisch durch ein Skript einen Batch Job zu einer bestimmten Zeit starten (dieser Job soll nur unter gewissen Bedingungen laufen, darum kann ich es nicht einfach eingeben).
Da die CalendarStartUp Items im launchd ja nun nicht funktionieren bleibt mir nur der Unix 'at' Befehl übrig. Die crontab Datei soll man ja nicht von Hand ändern, sondern nur mit crontab -e
(wenn jemand ne Idee hat, wie das mit crontab geht, wäre es auch gut, das funktioniert nämlich).

System: Powerbook G4, mit OS X 10.4.2

1. Ich habe im System->Library->LaunchDaemons->com.apple.atrun.plist den "Disabled" Flag auf No gesetzt und mit "sudo launchctl list" sehe ich auch, dass er läuft.
2. Ich gebe im Terminal einen "at job" ein:
Code:
username$ at 2022
ls > test.txt
<CTRL D>
3. Ich bekomme eine entsprechende Bestätigung, dass der Job gequeued wurde (etwa 'job 8 at Sat Oct 22 20:22:00 2005')
4. Nach einiger Zeit nach 2022 (laut atrun plist file wird dies alle 5 min ausgeführt) ist der Job aus der Queue verschwunden (Probe mit atq, wo er vorher immer aufgelistet wurde)

Soweit sieht es echt gut aus, aber das File test.txt wird nicht geschrieben .
Habe alle möglichen Varianten ausprobiert (at -f cmds 2022), echo "ls > test.txt" | at 2022) andere Kommandos usw. aber es passiert einfach nichts. :confused: Ist lange her, dass ich etwas mit Unix gemacht habe und vielleicht verpasse ich etwas völlig Blödes.

Mit spotlight habe ich auch schon versucht, das Ausgabefile (test.txt) woanders zu finden. Ohne Erfolg
Hat jemand diesen Befehl im Tiger mal erfolgreich benutzt ??

Matthias
 
matzh schrieb:
Entweder ich stehe irgendwie völlig auf der Leitung oder es funktioniert wirklich nicht.
Ich möchte dynamisch durch ein Skript einen Batch Job zu einer bestimmten Zeit starten (dieser Job soll nur unter gewissen Bedingungen laufen, darum kann ich es nicht einfach eingeben).
Mit at kenne ich mich leider selber nicht besonders aus, aber du kannst einen Cronjob z.B. aus einem Script heraus definieren, indem du ausführst:

crontab <datei>

In der <datei> muss einfach eine Cron-Anweisung à la "* 20 * * * <script>" stehen.

Ich hoffe, damit kannst du das so umsetzen, wie du es wolltest. Bedingungen kannst du ja direkt im auszuführenden Script <script> einbauen.

Achtung: Cronjobs verlangen für alle Befehle den VOLLEN Pfad, also immer schön alles ausschreiben, sonst wunderst du dich, warum der Job nicht funktioniert
smile15x18.gif
. Es kann übrigens sein, dass das bei at auch so ist, aber da bewege ich mich auf unsicherem Boden...
 
Zumindest unter Panther deaktiviert

Auszug aus man at:

NOTE
at, batch, atq, atrm are all disabled by default on Mac OS X. Each of
these commands depend on the execution of atrun(8) which has been dis-
abled due to power management concerns. Those who would like to use
these commands, must first re-enable /usr/libexec/atrun by removing the
leading '#' from the line

Gruß
Nick
 
Zuletzt bearbeitet:
Danke für Eure Antworten. Ja, das mit dem crontab direkt ändern sollte schon irgendwie gehen. Da ich auch andere Sachen im crontab stehen habe, muss ich das mit sed recht kompliziert eingeben, von daher wäre der at schon besser.
Wenn im crontab file die entsprechende Zeile mit dem skript "dummy.app" zunächst auskommentiert ist:
crontab -l | sed 's/#\([a-zA-Z0-9_/* ]*\)dummy.asp/\1dummy.asp/' | crontab
und für den Rückweg:
crontab -l | sed 's/\([a-zA-Z0-9_/* ]*\)dummy.asp/#\1dummy.asp/' | crontab
Das finde ich ziemlich "gehackt", da wäre ein einfacher "at" Befehl schon praktischer ;)

@nick_dermot: ich glaube, ich hab das atrun schon richtig aktiviert (Schritt 1 oben):
In der Console steht folgende Fehlermeldung:
Oct 23 13:07:29 mhoelling atrun[1441]: File a00014011f63f8 is in wrong format - aborting

Dazu findet man auch etwas im Google, dass ältere Versionen von Debian Linux atrun mit Benutzernamen mit 8+ Zeichen nicht unterstützen. Dazu gibt es wohl einen Patch, aber das ist mir zu kompliziert.
 
matzh schrieb:
Da ich auch andere Sachen im crontab stehen habe, muss ich das mit sed recht kompliziert eingeben, von daher wäre der at schon besser.
Da hast du Recht, daran habe ich nicht gedacht, sorry. Irgendwie hatte ich im Kopf, dass "crontab <datei>" einen Job hinzufügt, aber das überschreibt ja alles, was natürlich nicht der Sinn der Übung ist...

Hoffe, du kriegst es noch hin mit at
smile15x18.gif
.
 
Wie wärs ganz einfach mit
Code:
sudo vi /etc/crontab
?

at würde ich persönlich nicht einsetzen.
cron ist AFAIK viel ressourcenschonender.
 
maceis schrieb:
Wie wärs ganz einfach mit
Code:
sudo vi /etc/crontab
?

at würde ich persönlich nicht einsetzen.
cron ist AFAIK viel ressourcenschonender.
Darf man das eigentlich? Ich dachte, man muss für das Editieren der Crontab zwingend "crontab -e" verwenden?

Allerdings kann es so einfach ja ohnehin nicht sein, matzh wollte doch dynamisch einen Cronjob generieren (oder doch nicht?).
 
Doch genauso ist es. Dynamisch.
Mit "sudo crontab -e" bin ich vorher auch schon weitergekommen. Dies ist wahrscheinlich fast identisch mit dem vi.
Ansonsten mache ich es halt wie oben angegeben, mit den sed-Filtern.
Praktisch sind beim "at" auch solche Kommandos wie "at now +2 minutes".
Das aus der Systemzeit "herauszufriemeln" und dann in die cron-Tabelle zu schreiben, ist schon ziemlich gehackt...

Trotzdem, danke für die Antwort.
 
matzh schrieb:
Doch genauso ist es. Dynamisch.
Mit "sudo crontab -e" bin ich vorher auch schon weitergekommen. Dies ist wahrscheinlich fast identisch mit dem vi.
Ansonsten mache ich es halt wie oben angegeben, mit den sed-Filtern.
Praktisch sind beim "at" auch solche Kommandos wie "at now +2 minutes".
Das aus der Systemzeit "herauszufriemeln" und dann in die cron-Tabelle zu schreiben, ist schon ziemlich gehackt...

Trotzdem, danke für die Antwort.
Dann würde ich es anders machen -- Holzhackermethode:

sudo echo "<dynamischer Cronjob>" >> /etc/crontab

Sollte hinhauen. Also doch dynamisch, maceis ;).
 
Zurück
Oben Unten