Die obigen Antworten sind der Standard / "richtige" Weg, um es zu tun.
Ein weiterer Ansatz, der aus Sicht des "Endbenutzers" einfacher ist, besteht darin, dass geplante oder Hintergrundaufgaben ihre Ausgabe in eine "Protokoll" -Datei schreiben. Die Datei kann sich überall auf Ihrem System befinden, aber wenn die Aufgabe als root ausgeführt wird (von cron
usw.), dann irgendwo darunter/var/log
ist es ein guter Ort, sie abzulegen.
Ich habe das /var/log/maint
Verzeichnis erstellt und es für alle lesbar gemacht. Unter dem Namen "backup" befindet sich eine lesbare Datei, in der ich die Ausgabe meiner Sicherungsskripte protokolliere.
Ich habe mein eigenes Verzeichnis erstellt, damit meine Dateien nicht mit den vom System generierten Dingen verwechselt werden.
Um Dinge dort abzulegen (in Bash):
BACKUP="/var/log/maint/backup"
echo "my message" >> "${BACKUP}"
Das >>
bewirkt , dass die Nachrichten an die Datei , um sie jedes Mal überschreiben , anstatt angehängt werden.
Wenn mein Skript viel Ausgabe enthält, verwende ich ein Skript oder eine Funktion für die Ausgabe, damit alles auf die gleiche Weise ausgeführt wird. Hier ist meine aktuelle (Overkill-Version): (Das VERBOSE-Zeug ist da, wenn ich das Skript von einem Terminal aus starte und sehen möchte, was zu Debugging-Zwecken vor sich geht.)
#!/bin/bash
## backup_logger
## backup system logging module
## Copyleft 01/20/2013 JPmicrosystems
## Usage is ${SCRIPT_NAME} [-v] [<caller> <log message text>]
## If present, -v says log to console as well as to the log file
## <caller> is the name of the calling script
## If <caller> <log message text> is not present, write a blank line to the log
## Must be placed in path, like ~/bin
## If log is owned by root or another user, then this must run as root ...
## If not, it just aborts
##source "/home/bigbird/bin/bash_trace" ## debug
SCRIPT_NAME="$(basename $0)"
USAGE="Usage is ${SCRIPT_NAME} [-v] [<caller> <log message text>]"
SYSLOGDIR='/var/log/maint'
SYSLOGFILE="${SYSLOGDIR}/backup.log"
LOGGING=1
VERBOSE=0
if [ "${1}" == "-v" ]
then
VERBOSE=1
shift
fi
##LOGGING=0 ## debug
##VERBOSE=1 ## debug
## Only zero or two parameters allowed - <caller> <log message text>
RC=0
if [ "$#" -eq 1 ] || [ "$#" -gt 2 ]
then
echo "${USAGE}"
RC=1
else
if [ ! -w "${SYSLOGFILE}" ]
then
touch "${SYSLOGFILE}"
if [ $? -ne 0 ]
then
echo -e "$(date) ${1} ${2}"
echo "${SCRIPT_NAME} Can't write to log file [${SYSLOGFILE}]"
RC=1
exit ${RC}
fi
fi
if [ -n "${1}" ]
then
(( LOGGING )) && echo -e "$(date) ${1} ${2}" >> "${SYSLOGFILE}"
(( VERBOSE )) && echo -e "$(date) ${1} ${2}"
else
(( LOGGING )) && echo "" >> "${SYSLOGFILE}"
(( VERBOSE )) && echo ""
fi
fi
exit $RC
Edit: Einfaches at
Beispiel, das in eine Benutzerdatei schreibt
Ich habe es nicht für immer benutzt, also habe ich es mit ein paar einfachen Skripten herausgefunden.
Das erste Skript plant das Ereignis nur mit at
. Der Befehl selbst könnte einfach in ein Terminal eingegeben werden, aber ich bin faul - insbesondere, wenn ich ihn beim Testen mehrmals ausführen muss, ohne mich mit dem Befehlsverlauf zu täuschen.
#!/bin/bash
## mytest_at_run
## Schedule a script to run in the immediate future
echo "/home/bigbird/bin/mytest_at_script" | at 00:56
Das zweite Skript ist dasjenige, dessen Ausführung geplant ist
#!/bin/bash
## mytest_at_script
## The script to be run later
echo "$(date) - is when this ran" >> /home/bigbird/log/at.log
Ich habe beide Skripte in einem Texteditor erstellt, gespeichert und sie dann jeweils mit ausführbar gemacht chmod 700 script-file-name
. Ich habe sie der Einfachheit halber in meinem $HOME/bin
Verzeichnis abgelegt , aber sie können sich überall befinden, wo mein Benutzer uneingeschränkten Zugriff hat. Ich verwende 700
jedes Skript, das nur zum Testen gedacht ist, aber auf einem Einzelnutzersystem kann es genauso gut sein 755
.
Ich habe bereits ein Verzeichnis aufgerufen /home/bigbird/log
, um die Ausgabe von zu speichern mytest_at_script
. Dies kann auch sein, wo Ihr Benutzer vollen Zugriff hat. Stellen Sie einfach sicher, dass es vorhanden ist, bevor das Skript ausgeführt wird, oder lassen Sie es vom Skript erstellen.
Um es auszuführen, habe ich nur sichergestellt, dass die Zeit für den at
Befehl mytest_at_run
in der Zukunft etwas länger ist, und habe es dann von einem Terminal aus ausgeführt. Ich wartete dann bis es lief und überprüfte den Inhalt von $HOME/log/at.log
.
bigbird@sananda:~/bin$ cat ~/log/at.log
Fri Sep 14 00:52:18 EDT 2018 - is when this ran
Fri Sep 14 00:56:00 EDT 2018 - is when this ran
bigbird@sananda:~/bin$
Ein paar Anmerkungen:
Obwohl ich at
von meinem Benutzer ausgeführt werde, kennt er meine Umgebung wie mein PATH
und mein Ausgangsverzeichnis nicht, daher gehe ich nicht davon aus. Ich benutze volle Pfade, wie ich es für jeden cron
Job tun würde . Und wenn ich es jemals zu einem cron
Job machen will , muss ich nichts ändern, nur um es zum Laufen zu bringen.
Früher habe ich >>
in mytest_at_script
zu append Ausgabe in die Protokolldatei statt , >
die es auf jedem Lauf ersetzt haben würde. Verwenden Sie das, was für Ihre Anwendung am besten geeignet ist.
sleep 3m; echo Running