리눅스에서 .sas 파일을 배치로 실행할 때는 sas 실행 파일에 -sysin 을 준다.
sas -sysin /path/to/job.sas \
-log /path/to/job.log \
-print /path/to/job.lst \
-noterminal
| 옵션 | 설명 |
|---|---|
-sysin |
실행할 .sas 파일 |
-log |
로그 파일 경로 |
-print |
출력(.lst) 파일 경로 |
-noterminal |
터미널 상호작용 비활성화. 배치에서는 사실상 필수다 |
-nosyntaxcheck |
앞선 오류 때문에 이후 구문이 건너뛰어지는 것을 막는다 |
-noovp |
출력 겹침 방지 |
-autoexec |
공통 설정 파일을 함께 실행한다 |
-set <이름> <값> |
매크로 변수에 값을 전달한다 |
-encoding |
세션 인코딩 지정 |
실행 파일 위치는 환경마다 다르다.
command -v sas
ls /opt/sas/viya/home/SASFoundation/9.4/sas
ls /usr/local/SASHome/SASFoundation/9.4/sas
SAS Viya 3.5 의 프로그래밍 런타임도 SAS 9.4 기반이므로 같은 실행 파일을 쓴다.
#!/bin/bash
# run_sas.sh <job.sas>
set -euo pipefail
SAS_PROGRAM="${1:-}"
if [[ -z "$SAS_PROGRAM" || ! -f "$SAS_PROGRAM" ]]; then
echo "Usage: $0 /path/to/job.sas"
exit 1
fi
SAS_EXEC="$(command -v sas || true)"
if [[ -z "$SAS_EXEC" ]]; then
for p in /opt/sas/viya/home/SASFoundation/9.4/sas \
/usr/local/SASHome/SASFoundation/9.4/sas \
/opt/sas/SASHome/SASFoundation/9.4/sas
do
[[ -x "$p" ]] && SAS_EXEC="$p" && break
done
fi
[[ -z "$SAS_EXEC" ]] && { echo "sas executable not found"; exit 1; }
BASENAME="$(basename "${SAS_PROGRAM%.*}")"
OUTDIR="${OUTDIR:-$(pwd)}"
mkdir -p "$OUTDIR"
"$SAS_EXEC" \
-sysin "$SAS_PROGRAM" \
-log "$OUTDIR/${BASENAME}.log" \
-print "$OUTDIR/${BASENAME}.lst" \
-noterminal -nosyntaxcheck -noovp
EC=$?
echo "SAS exit code: $EC"
exit $EC
-set 으로 넘긴 값은 SAS 안에서 매크로 변수로 참조한다.
./run_sas.sh /jobs/daily_load.sas -set BIZ_DT "$(date +%Y%m%d)" -set AREA KR
%put NOTE: BIZ_DT=&BIZ_DT AREA=&AREA;
여러 개를 받을 때는 KEY=VAL 형태의 인자를 변환해 붙인다.
SET_ARGS=()
for kv in "$@"; do
SET_ARGS+=(-set "${kv%%=*}" "${kv#*=}")
done
"$SAS_EXEC" -sysin "$SAS_PROGRAM" -noterminal "${SET_ARGS[@]}"
CAS 접속처럼 모든 배치가 공통으로 하는 작업은 autoexec 에 넣는다.
/* autoexec.sas */
%let _cas_host = %sysget(CAS_HOST);
%let _cas_port = %sysget(CAS_PORT);
cas mysess host="&_cas_host" port=&_cas_port;
libname casuser cas sessref=mysess;
export CAS_HOST="<cas-controller-host>"
export CAS_PORT="5570"
sas -sysin /jobs/cas_job.sas \
-autoexec /opt/sas/viya/config/usermods/autoexec.sas \
-log /var/log/sasjobs/cas_job.log \
-noterminal
세션 인코딩이 데이터와 맞지 않으면 배치에서 조용히 깨진다. 필요하면 명시한다.
sas -sysin job.sas -log job.log -print job.lst -encoding euckr -noterminal
nohup ./run_sas.sh /jobs/daily_load.sas > /var/log/sasjobs/daily_load.nohup 2>&1 &
10 1 * * * /opt/batch/run_sas.sh /jobs/daily_load.sas BIZ_DT=$(date +\%Y\%m\%d) OUTDIR=/var/log/sasjobs
crontab 안에서는 % 를 백슬래시로 이스케이프해야 한다.
sas 실행 파일 경로