คำตอบข้างต้นเป็นวิธีการมาตรฐาน / "ถูกต้อง"
อีกวิธีที่ง่ายกว่าจากมุมมอง "ผู้ใช้ปลายทาง" มากขึ้นคือการกำหนดเวลาหรืองานพื้นหลังให้เขียนเอาต์พุตไปยังไฟล์ "บันทึก" ไฟล์สามารถอยู่ที่ใดก็ได้ในระบบของคุณ แต่หากงานกำลังทำงานในฐานะรูท (จากcron
ฯลฯ ) แสดงว่าที่ใดที่หนึ่งภายใต้/var/log
เป็นสถานที่ที่ดีที่จะวางไว้
ฉันสร้าง/var/log/maint
ไดเรกทอรีและทำให้ทุกคนสามารถอ่านได้และฉันมีไฟล์ที่อ่านได้ภายใต้ชื่อ "backup" ซึ่งฉันบันทึกผลลัพธ์จากสคริปต์สำรองของฉัน
ฉันสร้างไดเรกทอรีของตัวเองเพื่อไม่ให้ไฟล์ปะปนกับสิ่งต่าง ๆ ที่ระบบสร้างขึ้น
ในการใส่สิ่งที่มี (ในทุบตี):
BACKUP="/var/log/maint/backup"
echo "my message" >> "${BACKUP}"
>>
ทำให้เกิดข้อความที่จะผนวกเข้ากับไฟล์แทนการเขียนทับในแต่ละครั้ง
หากสคริปต์ของฉันมีเอาต์พุตจำนวนมากฉันจะใช้สคริปต์หรือฟังก์ชันเพื่อเอาท์พุทดังนั้นทุกอย่างก็จะเหมือนเดิม ด้านล่างคือปัจจุบันของฉัน (เวอร์ชั่น overkill): (สิ่ง VERBOSE มีไว้สำหรับเมื่อฉันเรียกใช้สคริปต์จากเทอร์มินัลและต้องการดูว่าเกิดอะไรขึ้นเพื่อวัตถุประสงค์ในการดีบัก)
#!/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
แก้ไข: at
ตัวอย่างง่ายๆที่เขียนไปยังไฟล์ผู้ใช้
ยังไม่ได้ใช้สิ่งนี้ตลอดไปดังนั้นฉันคิดออกด้วยสคริปต์ง่ายๆ
at
สคริปต์แรกเพียงแค่ตารางการแข่งขันโดยใช้ คำสั่งนั้นสามารถพิมพ์ลงในเทอร์มินัลได้ แต่ฉันขี้เกียจ - โดยเฉพาะเมื่อฉันต้องทำหลาย ๆ ครั้งในขณะที่ทดสอบโดยไม่หลอกด้วยคำสั่งประวัติ
#!/bin/bash
## mytest_at_run
## Schedule a script to run in the immediate future
echo "/home/bigbird/bin/mytest_at_script" | at 00:56
สคริปต์ที่สองคือสคริปต์ที่กำหนดให้เรียกใช้
#!/bin/bash
## mytest_at_script
## The script to be run later
echo "$(date) - is when this ran" >> /home/bigbird/log/at.log
ฉันสร้างสคริปต์ทั้งสองในโปรแกรมแก้ไขข้อความบันทึกไว้แล้วทำให้แต่ละไฟล์ใช้งานchmod 700 script-file-name
ได้ ฉันวางทั้งสองไว้ใน$HOME/bin
ไดเรกทอรีเพื่อความสะดวก แต่พวกเขาอาจเป็นที่ใดก็ได้ที่ผู้ใช้ของฉันสามารถเข้าถึงได้อย่างเต็มที่ ฉันใช้700
สำหรับสคริปต์ใด ๆ ที่ใช้สำหรับการทดสอบ แต่ในระบบผู้ใช้ระบบเดียวก็สามารถทำได้เช่นกัน755
แต่ในระบบผู้ใช้คนเดียวก็อาจเพียงเช่นกันเป็น
ฉันมีไดเรกทอรีที่เรียกว่า/home/bigbird/log
บันทึกเอาต์พุต mytest_at_script
แล้ว ผู้ใช้ของคุณสามารถเข้าถึงได้อย่างเต็มที่ ตรวจสอบให้แน่ใจว่ามีอยู่ก่อนที่สคริปต์จะทำงานหรือสร้างสคริปต์ขึ้นมา
เมื่อต้องการเรียกใช้ฉันเพิ่งทำให้แน่ใจว่าเวลาสำหรับat
คำสั่งในmytest_at_run
อนาคตเล็กน้อยแล้ววิ่งจากเทอร์มินัล $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$
หมายเหตุเล็กน้อย:
แม้ว่าฉันจะเรียกใช้at
จากผู้ใช้ของฉันก็ไม่ทราบว่าสภาพแวดล้อมของฉันเช่นฉันPATH
และไดเรกทอรีบ้านของฉันดังนั้นฉันไม่คิดว่า ฉันใช้เส้นทางแบบเต็มเช่นเดียวกับที่ฉันต้องการสำหรับcron
งานใด ๆ และถ้าฉันต้องการที่จะทำให้มันเป็นcron
งานฉันไม่ต้องเปลี่ยนอะไรเลยเพื่อให้มันทำงานได้
ผมใช้>>
ในmytest_at_script
การส่งออกผนวกไปยังแฟ้มบันทึกแทน>
ซึ่งจะมีการแทนที่มันในทุกระยะ ใช้อย่างใดอย่างหนึ่งที่เหมาะสมกับใบสมัครของคุณที่ดีที่สุด
sleep 3m; echo Running