저는 bash 스크립트 세트를 작성하고 있습니다.
첫 번째는 wrapper
두 개의 스크립트를 호출합니다: do_something
및 do_something_else
.
의사코드에서:
$ wrapper
do_something
if exitcode of do_something = 0 then
do_something_else
else
exit with error
fi
exit success
그러면 로그 파일이 생성됩니다.
$ cat /var/logs/wrapper.log | tail -3
Deleting file 299
Deleting file 300
wrapper ran successfully on 01/01/18 00:01:00 GMT
나는 두 가지 목표를 가지고 있습니다:
- 전체 프로세스에 대한 로그를 만듭니다. 즉, stdout 및 stderr로 전송된 모든 내용이 스크립트의 일일 실행을 보여주는 로그 파일에 포함되어
do_something
오류를 확인할 수 있기를 원합니다do_something_else
.wrapper
- 모든 시스템 에 넣을 수 있도록
do_something
미리 컴파일하고 싶습니다 . 이렇게 하면 개발 중에 소스 코드를 보유하고 프로덕션에서 편집할 수 없는 코드를 빠르게 실행할 수 있습니다.do_something_else
wrapper
/usr/bin
scp
가능합니까?
답변1
OP가 원하는 기능을 잃지 않고 스크립트에서 이 상황을 처리하는 방법에 대한 예는 다음과 같습니다.
여러 논리 블록을 동시에 실행하거나 한 번에 하나의 논리 블록을 실행하는 기능.
이러한 작업을 파일에 기록하는 기능.
이것은 간단한 예입니다. 스크립팅 언어를 다른 언어와 마찬가지로 취급하고 체계적인 코드를 작성하면 갑자기 그 언어로 모든 종류의 작업을 수행할 수 있습니다. 요령은 함수 외부에 느슨한 논리 덩어리를 두지 않는 것입니다. 그래야 쉽게 항목을 전환하고, 다른 것 대신 사용하고, 부분을 디버그하고, 로깅 함수를 추가할 수 있습니다. 이것이 제가 일반적으로 하는 일인 error_handler() 등입니다. 추가 작업이 거의 필요하지 않습니다. 즉, 무작위로 여러 행으로 쌓인 작업이 아닌 단순하지만 깨끗하고 유지 관리하기 쉬운 응용 프로그램이 완성된다는 의미입니다.
파일:내 물건
#!/usr/bin/env bash
logfile='logfile.log'
function main() {
case "$1" in
run-all)
block_1
block_2
;;
run-1)
block_1
;;
run-2)
block_2
;;
*)
echo 'No start option provided. Exiting'
exit 1
;;
esac
}
function block_1(){
do_something
if [ "$?" == 0 ]; then
do_something_else
echo "Deleting file 299" >> $logfile
echo "Deleting file 300" >> $logfile
echo "wrapper ran successfully on 01/01/18 00:01:00 GMT" >> $logfile
else
exit "$?"
fi
}
function block_2(){
do_something
if [ "$?" == 0 ]; then
do_something_else
echo "Deleting file 299" >> $logfile
echo "Deleting file 300" >> $logfile
echo "wrapper ran successfully on 01/01/18 00:01:00 GMT" >> $logfile
else
exit "$?"
fi
}
# $@ is the list of start arguments, which main will use
# with $1, $2, and so on.
main $@
다음과 같이 실행할 수 있습니다.
./my_stuff 'run-all'
물론 이는 단지 예일 뿐이지만 실제로 여러분이 하는 일은 논리를 구성하고 모든 언어에서와 같은 방식으로 정렬한 다음 원하는 작업을 실행하는 것뿐입니다. 쉘 스크립트가 사용 및 유지 관리된다는 가정하에 쉘 스크립트를 시작하고 함수를 사용하여 작성하면 다른 프로그래밍만큼 유연하고 유지 관리가 쉽다는 것을 발견했습니다.
답변2
로그 파일 부분에 대한 모든 것: exec
stdout 및 stderr을 리디렉션하는 경우, date
로그 파일 이름에 날짜를 입력하는 경우는 다음과 같습니다.
#!/bin/bash
exec > /somedir/somelog.$(date +%F)
exec 2>&1
# output goes to the log file even if this is an external command
somecmd...