SAS Management Console 에서 스케줄 Flow 를 돌릴 때 .sas 파일을 상대경로로 지정해 두었더니 /opt/sas/config/Lev1/SASApp/ 아래에서 파일을 찾는다. 코드를 다른 디렉터리에 모아 두고 싶은데 어디를 고쳐야 하는지가 문제다.
경로는 한 군데에서 정해지지 않는다. 다음 세 자리 중 하나가 답이고, 어느 쪽을 쓸지는 운영 방식에 따라 다르다.
상대경로의 기준점이다. 세션이 뜨는 위치를 바꾸면 그 아래 상대경로가 모두 따라 움직인다.
SAS Management Console 에서 다음을 연다.
Server Manager -> SASApp -> SASApp - Workspace Server -> Properties -> Options -> Advanced Options
여기서 시작 디렉터리에 해당하는 항목을 바꾼다. 화면의 항목 이름은 릴리스마다 다르므로 실제 화면에서 확인한다 (확인 필요).
바꾼 뒤에는 Object Spawner 를 재기동해야 반영된다.
/opt/sas/config/Lev1/ObjectSpawner/ObjectSpawner.sh restart
이 방법은 그 논리 서버를 쓰는 모든 세션에 영향을 준다. Flow 하나만 옮기려는 것이라면 과한 변경이다.
가장 부작용이 적다. 스케줄 대상 작업이 가리키는 .sas 파일을 절대경로로 바꾸면 시작 디렉터리와 무관해진다.
/sasdata/jobs/daily/load_sales.sas
DI Studio 로 배포한 작업이라면 배포 디렉터리가 작업 속성에 들어 있다. 배포를 다시 하면 그 값으로 덮이므로, 경로를 바꾼 뒤에는 재배포 설정도 함께 맞춘다.
Workspace Server 의 autoexec 에서 파일 참조를 미리 정의해 두면 코드 안에서는 논리 이름만 쓰면 된다.
filename jobs '/sasdata/jobs/daily';
libname sasdata '/sasdata/lib';
이 내용은 다음 파일에 넣는다.
/opt/sas/config/Lev1/SASApp/WorkspaceServer/appserver_autoexec_usermods.sas
usermods 파일에 넣는 것이 중요하다. 같은 디렉터리의 appserver_autoexec.sas 는 배포 도구가 다시 만들면서 덮어쓴다.
세션이 실제로 어디에서 뜨는지 확인한다.
%put %sysfunc(pathname(work));
XCMD 옵션이 켜져 있으면 작업 디렉터리를 직접 찍어 볼 수 있다.
data _null_;
rc = system('pwd');
run;
XCMD 가 꺼져 있으면 이 방법은 쓸 수 없다. WORK 경로만으로도 어느 Lev 아래에서 떴는지는 알 수 있다.
새 경로는 Workspace Server 가 뜨는 계정이 읽을 수 있어야 한다. 스케줄 실행 계정과 대화형 접속 계정이 다르면 한쪽만 동작한다.
여러 노드로 구성된 환경에서는 모든 노드에 같은 경로가 있어야 한다. 공유 스토리지를 쓰지 않으면 어느 노드로 배정되느냐에 따라 성공과 실패가 갈린다.
경로를 바꾼 뒤 기존 Flow 의 로그 출력 위치도 함께 바뀔 수 있다. 로그 수집 스크립트가 있다면 같이 손본다.