Powyższe odpowiedzi są standardowym / „właściwym” sposobem na zrobienie tego.
Innym podejściem, które jest prostsze z punktu widzenia „użytkownika końcowego”, jest zapisanie wyników dowolnego zadania zaplanowanego lub zadania w tle w pliku „dziennika”. Plik może znajdować się w dowolnym miejscu w systemie, ale jeśli zadanie działa jako root (z cron
itp.), To gdzieś poniżej /var/log
jest dobre miejsce, aby go umieścić.
Utworzyłem /var/log/maint
katalog i sprawiłem, że jest czytelny dla wszystkich, a pod tym plikiem o nazwie „kopia zapasowa” mam czytelny plik, w którym loguję dane wyjściowe z moich skryptów kopii zapasowej.
Stworzyłem własny katalog, aby moje pliki nie mieszały się z elementami generowanymi przez system.
Aby umieścić tam rzeczy (w bash):
BACKUP="/var/log/maint/backup"
echo "my message" >> "${BACKUP}"
>>
Powoduje komunikaty mają być dołączone do pliku zamiast zastępowanie go za każdym razem.
Jeśli mój skrypt ma dużo danych wyjściowych, używam skryptu lub funkcji dla danych wyjściowych, więc wszystko robi się tak samo. Poniżej moja obecna (wersja z nadmiarem umiejętności): (VERBOSE jest dostępne, gdy uruchamiam skrypt z terminala i chcę zobaczyć, co się dzieje w celu debugowania).
#!/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
Edycja: Prosty at
przykład, który zapisuje do pliku użytkownika
Nie używałem tego od zawsze, więc wymyśliłem to za pomocą kilku prostych skryptów.
Pierwszy skrypt po prostu planuje użycie zdarzenia at
. Samą komendę można po prostu wpisać w terminal, ale jestem leniwy - szczególnie, gdy muszę to zrobić wiele razy podczas testowania, bez oszukiwania w historii komend.
#!/bin/bash
## mytest_at_run
## Schedule a script to run in the immediate future
echo "/home/bigbird/bin/mytest_at_script" | at 00:56
Drugi skrypt jest tym, który ma zostać uruchomiony
#!/bin/bash
## mytest_at_script
## The script to be run later
echo "$(date) - is when this ran" >> /home/bigbird/log/at.log
Utworzyłem oba skrypty w edytorze tekstów, zapisałem je, a następnie sprawiłem, że każdy z nich jest wykonywalny chmod 700 script-file-name
. $HOME/bin
Dla wygody umieściłem je oba w moim katalogu, ale mogą być w dowolnym miejscu, w którym mój użytkownik ma pełny dostęp. Używam 700
do każdego skryptu, który jest tylko do testowania, ale równie dobrze może być w systemie dla jednego użytkownika 755
.
Mam już katalog, w którym /home/bigbird/log
można zapisać dane wyjściowe mytest_at_script
. Może to być także wszędzie tam, gdzie użytkownik ma pełny dostęp. Po prostu upewnij się, że istnieje przed uruchomieniem skryptu lub niech skrypt go utworzy.
Aby go uruchomić, po prostu upewniłem się, że czas na at
polecenie mytest_at_run
jest trochę w przyszłości, a następnie uruchomiłem go z terminala. Potem zaczekałem, aż się uruchomi, i sprawdziłem zawartość $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$
Kilka uwag:
Mimo że uruchamiam się at
od mojego użytkownika, nie zna on mojego środowiska, takiego jak mój PATH
i mój katalog domowy, więc nie zakładam tego. Używam pełnych ścieżek, jak w przypadku każdej cron
pracy. A jeśli kiedykolwiek będę chciał zrobić z tego cron
pracę, nie będę musiał niczego zmieniać, żeby ją uruchomić.
Kiedyś >>
w mytest_at_script
celu wyjścia dołączone do pliku dziennika zamiast >
które zastąpiły go na każdym biegu. Używaj tych, które najlepiej pasują do Twojej aplikacji.
sleep 3m; echo Running