Các câu trả lời trên là cách chuẩn / "đúng" để làm điều đó.
Một cách tiếp cận khác đơn giản hơn từ quan điểm "người dùng cuối" hơn là có bất kỳ tác vụ nền hoặc lịch trình nào ghi đầu ra của nó vào tệp "nhật ký". Tệp có thể ở bất cứ đâu trên hệ thống của bạn, nhưng nếu tác vụ đang chạy dưới quyền root (từ cron
, v.v.), thì một nơi nào đó bên dưới /var/log
là một nơi tốt để đặt nó.
Tôi đã tạo /var/log/maint
thư mục và làm cho mọi người có thể đọc được và tôi có một tệp có thể đọc được dưới tên gọi là "bản sao lưu" nơi tôi ghi nhật ký đầu ra từ các tập lệnh sao lưu của mình.
Tôi đã tạo thư mục của riêng mình để các tệp của tôi không bị lẫn vào những thứ do hệ thống tạo ra.
Để đặt công cụ ở đó (trong bash):
BACKUP="/var/log/maint/backup"
echo "my message" >> "${BACKUP}"
Các >>
nguyên nhân gây các tin nhắn được nối thêm vào các tập tin thay vì ghi đè lên nó mỗi lần.
Nếu tập lệnh của tôi có nhiều đầu ra, tôi sử dụng tập lệnh hoặc hàm cho đầu ra để mọi thứ được thực hiện như nhau. Dưới đây là hiện tại của tôi (phiên bản quá mức): (Nội dung ĐỘNG TỪ có sẵn khi tôi đang chạy tập lệnh từ thiết bị đầu cuối và muốn xem những gì đang diễn ra cho mục đích gỡ lỗi.)
#!/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
Chỉnh sửa: at
Ví dụ đơn giản ghi vào tệp người dùng
Không sử dụng nó mãi mãi, vì vậy tôi đã tìm ra nó với một vài kịch bản đơn giản.
Kịch bản đầu tiên chỉ lên lịch sự kiện bằng cách sử dụng at
. Bản thân lệnh chỉ có thể được gõ vào một thiết bị đầu cuối, nhưng tôi lười biếng - đặc biệt là khi tôi phải thực hiện nó nhiều lần trong khi kiểm tra nó mà không bị lừa với lịch sử lệnh.
#!/bin/bash
## mytest_at_run
## Schedule a script to run in the immediate future
echo "/home/bigbird/bin/mytest_at_script" | at 00:56
Kịch bản thứ hai là kịch bản dự kiến chạy
#!/bin/bash
## mytest_at_script
## The script to be run later
echo "$(date) - is when this ran" >> /home/bigbird/log/at.log
Tôi đã tạo cả hai tập lệnh trong một trình soạn thảo văn bản, lưu chúng và sau đó làm cho chúng thực thi từng tập lệnh bằng cách sử dụng chmod 700 script-file-name
. Tôi đặt cả hai trong $HOME/bin
thư mục của tôi để thuận tiện, nhưng chúng có thể là bất cứ nơi nào người dùng của tôi có quyền truy cập đầy đủ. Tôi sử dụng 700
cho bất kỳ tập lệnh nào chỉ để thử nghiệm, nhưng trên một hệ thống người dùng, nó cũng có thể là755
.
Tôi đã có một thư mục được gọi /home/bigbird/log
để lưu đầu ra từ mytest_at_script
. Đây cũng có thể là bất cứ nơi nào người dùng của bạn có quyền truy cập đầy đủ. Chỉ cần chắc chắn rằng nó tồn tại trước khi tập lệnh chạy hoặc có tập lệnh tạo nó.
Để chạy nó, tôi chỉ đảm bảo rằng thời gian cho at
lệnh trong mytest_at_run
một chút trong tương lai và sau đó chạy nó từ một thiết bị đầu cuối. Sau đó tôi đợi cho đến khi nó chạy và kiểm tra nội dung của $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$
Một vài lưu ý:
Mặc dù tôi đang chạy at
từ người dùng của mình, nhưng nó không biết môi trường của tôi như PATH
thư mục nhà của tôi và vì vậy tôi không cho rằng điều đó. Tôi sử dụng các đường dẫn đầy đủ như tôi sẽ làm cho bất kỳ cron
công việc. Và nếu tôi muốn làm cho nó mộtcron
công việc, tôi sẽ không phải thay đổi bất cứ điều gì chỉ để làm cho nó chạy.
Tôi đã sử dụng >>
trong mytest_at_script
sản lượng append vào file log thay vì >
đó sẽ thay thế nó trên mỗi chạy. Sử dụng cái nào phù hợp với ứng dụng của bạn nhất.
sleep 3m; echo Running