
Ich möchte at
E-Mail-Benachrichtigungen für eine bestimmte Klasse von Jobs deaktivieren. Wenn ich beispielsweise den folgenden Anwendungsfall teste (einen Job mittendrin beenden),nichtIch möchte eine Ausgabe, aber denselben Code in der Produktion. Ich möchte die per E-Mail gesendete Ausgabe:
$ at now <<<'/usr/bin/timeout 15s nc -l 20242'
job 71 at 2016-05-16 15:03
$ pidof /usr/bin/timeout
11853
$ kill 11853
$ mail
Heirloom Mail version 12.4 7/29/08. Type ? for help.
"/var/spool/mail/bishop": 1 message 1 new
>N 1 bishop@trencher Mon May 16 15:03 16/920 "Output from your job 71"
& 1
Message 1:
From bishop@trencher Mon May 16 15:03:30 2016
Date: Mon, 16 May 2016 15:03:30 -0400
From: bishop@trencher
Subject: Output from your job 71
To: bishop@trencher
Status: R
/bin/bash: line 1: 11853 Terminated /usr/bin/timeout 15s nc -l 20242
Ich weiß, dass ich festlegen kann MAILPATH=/dev/null
, aber ich hätte lieber eine feinere Kontrolle. Das Festlegen von MAIL
und MAILTO
hatte keine offensichtliche Wirkung. Ich dachte, ich könnte den Job bearbeiten, um die # mail
Anweisung zu entfernen, aber das scheint nicht zu funktionieren:
at 15:15 <<<'date'
at -c 73 | grep -v '^# mail bishop' | at 15:15
atrm 73
Ich habe überall gesucht, aber sagen wir einfach, die Suche nach einem Befehl namens at ist nicht trivial. Ich kann nicht einmal den at-Quellcode finden: Ist er nicht in den GNU-Coreutils enthalten?
AKTUALISIEREN: Stationsidentifikation:
$ uname -a
Linux trencher 4.4.8-20.46.amzn1.x86_64 #1 SMP Wed Apr 27 19:28:52 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ at -V
at version 3.1.10
Ist es möglich, pro Auftrag zu steuern, ob die Ausgabe – jegliche Ausgabe – an den übermittelnden Benutzer gesendet wird?
Antwort1
RedHat (und damit Centos und Freunde) at
und auch von Debian abgeleitete Versionen (wobei rpm -qi at
RedHat auf eine Debian-URL hinweist und auch derobert in den Kommentaren oben) sollten eine -M
Option unterstützen:
-M Never send mail to the user.
Andernfalls besteht eine weitere Möglichkeit darin, die Ausgabe des Jobs zu unterdrücken:
#!/bin/bash
exec >/dev/null 2>&1
... the usual job commands here ...
Oder leiten Sie die Ausgabe stattdessen an logger
oder in eine Protokolldatei weiter, falls die Ausgabe überprüft werden muss.
Eine weitere Möglichkeit wäre, den Mail-Transport-Agenten zu ändern (insbesondere, da es sich um Entwicklungssysteme handelt) und alle Mails /dev/null
in eine Postfachdatei irgendwo auf dem Entwicklungsserver zu verschieben oder dort abzulegen. Dies ist jedoch mit mehr Arbeit verbunden.
Antwort2
at
Stellen Sie dem übergebenen Befehl chronic
(aus dem moreutils
Paket) voran, damit Sie immer nochbeidestderr und stdout, wenn der Befehl mit einem Fehlerstatus beendet wurde, andernfalls nichts.
Machen Sie dasselbe mit Ihren Cron-Jobs, wenn Sie schon dabei sind.