Sehen Sie sich die Ausgabe von 'at' an, bevor sie abgeschlossen ist

731
Drew Chapin

Angenommen, ich führe ein Skript unter atLinux aus (Beispiel unten), von dem ich weiß, dass es mehrere Stunden oder sogar mehrere Tage dauern wird. Ich bin daran gewöhnt, ateine E-Mail mit der Ausgabe des Befehls zu senden, sobald er abgeschlossen ist. Was aber, wenn ich die aktuelle Ausgabe vor dem Abschluss betrachten wollte? Nehmen wir auch an, ich habe das Skript bereits ausgeführt und habe vergessen, die Ausgabe mithilfe von oder ähnlichen Methoden umzuleiten tail, teeund möchte das Skript nicht anhalten. Gibt es überhaupt etwas zu tun?

drew@anubis:~$ at now warning: commands will be executed using /bin/sh at> ./myscript.sh at> <EOT> job 3 at Sat Jan 7 09:31:00 2017 
9
Gipfel oder Blick? Sie möchten sehen, was es tut, während es es tut? Journeyman Geek vor 7 Jahren 0
@JourneymanGeek, Oops. Peek wäre das, was ich schreiben wollte. Ich möchte sehen, was es tut. Drew Chapin vor 7 Jahren 0
Die Skriptausgabe in eine Datei umleiten, wenn Sie den at-Job einplanen und die Datei "tail -f" einplanen? muru vor 7 Jahren 0
@muru, lass uns so tun, als hätte ich das Skript bereits ohne "tail" ausgeführt und möchte es nicht stoppen. Drew Chapin vor 7 Jahren 0
Ich müsste testen, würde aber das Skript ändern, um tee zu verwenden, die Ausgabe in einer Datei zu speichern und sie dann abzuschließen? Journeyman Geek vor 7 Jahren 0
@JourneymanGeek, ich suche nach einer Methode, dies zu tun, wenn ich vergessen habe, die Ausgabe innerhalb des Skripts umzuleiten, und das Skript nicht anhalten möchte. Ich habe die Frage mit diesem Detail aktualisiert. Drew Chapin vor 7 Jahren 0

2 Antworten auf die Frage

9
muru

Wenn der Job gestartet wurde und Sie die PID dieses Jobs abrufen können, können Sie feststellen, wo atdie Ausgabe gespeichert wird:

$ at now warning: commands will be executed using /bin/sh at> sleep 10m at> <EOT> job 7 at Sat Jan 7 20:18:00 2017 $ pgrep sleep 7582 $ ls -l /proc/7582/fd total 0 lr-x------ 1 muru muru 64 Jan 7 20:19 0 -> /var/spool/cron/atjobs/a0000701795998 (deleted) lrwx------ 1 muru muru 64 Jan 7 20:19 1 -> /var/spool/cron/atspool/a0000701795998 lrwx------ 1 muru muru 64 Jan 7 20:19 2 -> /var/spool/cron/atspool/a0000701795998 

Wie Sie sehen, wird die Ausgabe in einer temporären Datei gespeichert, die Sie nun überprüfen können:

$ sudo tail -f /var/spool/cron/atspool/a0000701795998 Subject: Output from your job 7 To: muru 

Sie benötigen, sudoweil das enthaltende Verzeichnis nicht weltweit zugänglich ist (zumindest auf Ubuntu 14.04):

$ sudo namei -lx /var/spool/cron/atspool/a0000701795998 f: /var/spool/cron/atspool/a0000701795998 Drwxr-xr-x root root / drwxr-xr-x root root var drwxr-xr-x root root spool drwxr-xr-x root root cron drwxrwx--T daemon daemon atspool -rw------- muru muru a0000701795998 
Sie sind mein Held! Das hat perfekt funktioniert! Drew Chapin vor 7 Jahren 1
Ich möchte jedoch hinzufügen, dass, wenn Sie wissen, dass Sie nur einen at-Job ausführen. Sie brauchen nicht einmal die PID. Sie können einfach `sudo ls / var / spool / cron / atspool` ausführen, und es sollte theoretisch die einzige Datei dort sein. Drew Chapin vor 7 Jahren 4
0
Drew Chapin

Um herauszufinden, welche Spooldatei zu Ihrem Job gehört, können Sie auch die Jobnummer abrufen atq.

drew@sokar:~$ atq 38 Tue Jul 10 12:15:00 2018 = drew 

Wandeln Sie die Auftragsnummer in Hex um. zB 38 (dec) = 26 (hex).

drew@sokar:~$ printf "%x\n" 38 26 

Ihre Datei erhält den Namen Warteschlangenbuchstabe (99% der Zeit a), gefolgt von der 5-stelligen Hex-Job-ID (die ich durch das Durchsuchen des Quellcodes des atBefehls gelernt habe ).

drew@sokar:~$ sudo ls -l /var/spool/cron/atspool total 55968 -rw------- 1 drew drew 49 Feb 16 2017 a0001c017a3cb2 -rw------- 1 drew drew 57297586 Feb 26 2017 a0001e017a7405 -rw------- 1 drew drew 2329 Jul 10 12:21 a0002601856a0f -----

Dann können Sie den Standard anzeigen

drew@sokar:~$ sudo less /var/spool/cron/atspool/a0002601856a0f