위의 답변은 표준 / "올바른"방법입니다.
보다 "최종 사용자"관점에서 더 간단한 또 다른 방법은 예약 된 작업이나 백그라운드 작업이 출력을 "로그"파일에 쓰도록하는 것입니다. 파일은 시스템의 어느 위치 에나있을 수 있지만 작업이 루트로 실행되는 경우 ( cron
등), 그 아래 /var/log
에있는 파일이 있으면 좋습니다.
내가 생성 된 /var/log/maint
디렉토리를하고 모두가 읽을 나는 내 백업 스크립트의 출력을 기록하는 소위 "백업"에서 읽을 수있는 파일이했다.
파일이 시스템에서 생성 된 것과 섞이지 않도록 내 디렉토리를 만들었습니다.
bash에 물건을 넣으려면 :
BACKUP="/var/log/maint/backup"
echo "my message" >> "${BACKUP}"
이렇게 >>
하면 매번 메시지를 덮어 쓰지 않고 파일에 메시지가 추가됩니다.
내 스크립트에 많은 출력이 있으면 출력에 스크립트 또는 함수를 사용하므로 모든 것이 동일하게 수행됩니다. 아래는 내 현재 (과도한 버전)입니다.
#!/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