Yukarıdaki cevaplar bunu yapmanın standart / "doğru" yoludur.
Daha "son kullanıcı" bakış açısından daha basit olan bir diğer yaklaşım, zamanlanmış veya arka plandaki herhangi bir görevin çıktısını bir "günlük" dosyasına yazmasını sağlamaktır. Dosya sisteminizde herhangi bir yerde olabilir, ancak görev kök (kimden cron
vb.) Olarak çalışıyorsa, altında /var/log
bir yere koymak için iyi bir yerdir.
/var/log/maint
Dizini oluşturdum ve herkes tarafından okunabilir hale getirdim ve "yedekleme" adı altında okunabilir bir dosyaya sahibim.
Kendi dizinimi oluşturdum, böylece dosyalarım sistem tarafından oluşturulan şeylerle karışmıyor.
Oraya bir şeyler koymak için:
BACKUP="/var/log/maint/backup"
echo "my message" >> "${BACKUP}"
>>
Mesajlar yerine o her zaman yazılmadan dosyasına eklenecek neden olur.
Komut dosyamda çok fazla çıktı varsa, çıktı için bir komut dosyası veya işlev kullanırım, böylece her şey aynı şekilde yapılır. Aşağıda benim mevcut (overkill sürümü): (Senaryoyu bir terminalden çalıştırdığımda ve hata ayıklama amacıyla neler olduğunu görmek istediğinizde VERBOSE şeyler var.)
#!/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
Düzenleme: at
Bir kullanıcı dosyasına yazılan basit örnek
Bunu sonsuza kadar kullanmadım, bu yüzden birkaç basit komut dosyasıyla anladım.
İlk komut dosyası olayı kullanarak zamanlar at
. Komutun kendisi sadece bir terminale yazılabilir, ama tembelim - özellikle komut geçmişini kandırmadan test ederken birden fazla kez yapmak zorunda kaldığımda.
#!/bin/bash
## mytest_at_run
## Schedule a script to run in the immediate future
echo "/home/bigbird/bin/mytest_at_script" | at 00:56
İkinci komut dosyası, çalıştırılması planlanan komut dosyasıdır
#!/bin/bash
## mytest_at_script
## The script to be run later
echo "$(date) - is when this ran" >> /home/bigbird/log/at.log
Her iki komut dosyasını da bir metin düzenleyicide oluşturdum, sakladım ve her birini kullanarak çalıştırılabilir yaptım chmod 700 script-file-name
. Her ikisini de $HOME/bin
kolaylık sağlamak için dizinime koydum , ancak kullanıcılarımın tam erişime sahip olduğu her yerde olabilirler. 700
Sadece test için herhangi bir komut dosyası için kullanıyorum , ancak tek bir kullanıcı sisteminde de olabilir 755
.
Zaten /home/bigbird/log
çıktı kaydetmek için adlı bir dizin var mytest_at_script
. Bu, kullanıcılarınızın tam erişime sahip olduğu her yerde de olabilir. Komut dosyası çalıştırmadan önce var olduğundan emin olun veya komut dosyasını oluşturmasını sağlayın.
Çalıştırmak için, at
komutun zamanının mytest_at_run
gelecekte biraz olduğundan emin oldum ve bir terminalden çalıştırdım. Sonra o kadar koştu ve içeriğini inceledim bekledi $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$
Birkaç not:
Koşuyorum rağmen at
benim kullanıcıdan, böyle benim olarak benim ortamını bilmiyor PATH
ben varsayalım kalmamak ve benim ev dizininde. Herhangi bir cron
iş için yaptığım gibi tam yolları kullanıyorum . Ve eğer bunu bir cron
iş yapmak istersem, sadece onu çalıştırmak için hiçbir şeyi değiştirmem gerekmeyecek.
Günlük dosyasına çıktı eklemek için kullandım >>
, mytest_at_script
bunun yerine >
her çalıştırmada değiştirirdim. Uygulamanız için en uygun olanı kullanın.
sleep 3m; echo Running