물론, 시스템 전체와 상호 작용할 수 없는 스크립트는 활용도가 떨어집니다. 스크립트가 시스템과 상호 작용할 수 있게 하는 내장 함수가 많이 있습니다.
|
스크립트가 대형 시스템과 상호 작용하는 가장 간단한 방법은 "run" 함수를 사용하는 것입니다. 이 함수는 실행할 명령을 사용하고 해당 명령의 출력을 문자열로 반환합니다. 예를 들어, 다음과 같습니다.
dory:> configuration version script dump(run('get boot_time')) ' boot_time = 2009-10-12 07:02:17\n'
내장 dump 함수는 내장된 개행을 확장하지 않고 인수를 외부로 덤프합니다. ECMAScript의 문자열 처리 기능을 사용하여 출력을 분할할 수 있습니다. 예를 들어, 공백으로 위를 분할하면 다음과 같습니다.
dory:> configuration version script dump(run('get boot_time').split(/\s+/)) ['', 'boot_time', '=', '2009-10-12', '07:02:17', '']
run 함수는 충분히 강력하므로 출력 구문 분석에 전적으로 의존하여 시스템에 대한 정보를 가져오려고 할 수도 있습니다. 그러나 이렇게 하면 앞으로 변경되거나 변경되지 않을 수 있으며 사람이 읽을 수 있는 출력을 구문 분석하는 스크립트가 남는다는 명확한 단점이 있습니다. 시스템에 대한 정보를 보다 강력하게 수집하려면 내장 "get" 함수를 사용합니다. boot_time 등록 정보의 경우 이는 문자열 대신 ECMAScript Date 객체를 반환하여 등록 정보 값을 프로그래밍적으로 조작할 수 있게 됩니다. 예를 들어, boot_time 등록 정보를 현재 시간과 함께 사용하여 부트 이후 경과한 시간을 확인할 수 있습니다.
script run('configuration version'); now = new Date(); uptime = (now.valueOf() - get('boot_time').valueOf()) / 1000; printf('up %d day%s, %d hour%s, %d minute%s, %d second%s\n', d = uptime / 86400, d < 1 || d >= 2 ? 's' : '', h = (uptime / 3600) % 24, h < 1 || h >= 2 ? 's': '', m = (uptime / 60) % 60, m < 1 || m >= 2 ? 's': '', s = uptime % 60, s < 1 || s >= 2 ? 's': '');
위를 "uptime.aksh"로 저장하면 다음과 같이 실행할 수 있습니다.
% ssh root@dory < uptime.aksh Pseudo-terminal will not be allocated because stdin is not a terminal. Password: up 2 days, 10 hours, 47 minutes, 48 seconds
의사 단말기 할당에 대한 메시지는 SSH 클라이언트 때문입니다. 이 메시지가 나타내는 문제는 SSH에 "-T" 옵션을 지정하여 처리할 수 있습니다.
동적 자식 항목이 있는 컨텍스트에서는 이러한 자식 항목을 프로그래밍적으로 반복하면 매우 유용할 수 있습니다. 이렇게 하려면 동적 자식 항목 어레이를 반환하는 list 함수를 사용합니다. 예를 들어, 다음은 소비한 공간과 사용 가능한 공간을 인쇄하며 모든 프로젝트의 모든 공유를 반복하는 스크립트입니다.
script run('shares'); projects = list(); for (i = 0; i < projects.length; i++) { run('select ' + projects[i]); shares = list(); for (j = 0; j < shares.length; j++) { run('select ' + shares[j]); printf("%s/%s %1.64g %1.64g\n", projects[i], shares[j], get('space_data'), get('space_available')); run('cd ..'); } run('cd ..'); }
이름이 "space.aksh"인 파일에 저장된 경우 스크립트를 실행하면 출력이 다음과 같습니다.
% ssh root@koi < space.aksh Password: admin/accounts 18432 266617007104 admin/exports 18432 266617007104 admin/primary 18432 266617007104 admin/traffic 18432 266617007104 admin/workflow 18432 266617007104 aleventhal/hw_eng 18432 266617007104 bcantrill/analytx 1073964032 266617007104 bgregg/dashbd 18432 266617007104 bgregg/filesys01 26112 107374156288 bpijewski/access_ctrl 18432 266617007104 ...
이 출력의 "출력 꾸미기"(프로그래밍적으로 처리하기가 더 어려움) 변형을 원하는 경우 get 명령의 출력을 직접 구문 분석합니다.
script run('shares'); projects = list(); printf('%-40s %-10s %-10s\n', 'SHARE', 'USED', 'AVAILABLE'); for (i = 0; i < projects.length; i++) { run('select ' + projects[i]); shares = list(); for (j = 0; j < shares.length; j++) { run('select ' + shares[j]); share = projects[i] + '/' + shares[j]; used = run('get space_data').split(/\s+/)[3]; avail = run('get space_available').split(/\s+/)[3]; printf('%-40s %-10s %-10s\n', share, used, avail); run('cd ..'); } run('cd ..'); }
이름이 "prettyspace.aksh"인 이 새 스크립트를 실행하면 일부 출력이 다음과 같습니다.
% ssh root@koi < prettyspace.aksh Password: SHARE USED AVAILABLE admin/accounts 18K 248G admin/exports 18K 248G admin/primary 18K 248G admin/traffic 18K 248G admin/workflow 18K 248G aleventhal/hw_eng 18K 248G bcantrill/analytx 1.00G 248G bgregg/dashbd 18K 248G bgregg/filesys01 25.5K 100G bpijewski/access_ctrl 18K 248G ...
정적 자식 항목이 있는 컨텍스트에서도 이러한 자식 항목을 프로그래밍적으로 반복하면 유용할 수 있습니다. 이렇게 하려면 정적 자식 항목 어레이를 반환하는 children 함수를 사용합니다. 예를 들어, 다음은 서비스 상태를 인쇄하며 모든 서비스를 반복하는 스크립트입니다.
configuration services script var svcs = children(); for (var i = 0; i < svcs.length; ++i) { run(svcs[i]); try { printf("%-10s %s\n", svcs[i], get('<status>')); } catch (err) { } run("done"); }
이름이 "svcinfo.aksh"인 파일에 저장된 경우 스크립트를 실행하면 출력이 다음과 같습니다.
% ssh root@koi < space.aksh Password: cifs disabled dns online ftp disabled http disabled identity online idmap online ipmp online iscsi online ldap disabled ndmp online nfs online nis online ntp online scrk online sftp disabled smtp online snmp disabled ssh online tags online vscan disabled
choices 함수는 값 세트가 확인되고 열거 가능한 등록 정보에 대해 유효한 등록 정보 값 어레이를 반환합니다. 예를 들어, 다음 스크립트는 choices 함수를 사용하여 shares 노드에서 모든 풀 목록을 검색한 후 모든 풀을 반복하여 사용 가능한 공간과 함께 프로젝트 및 공유를 나열합니다.
fmt = '%-40s %-15s %-15s\n'; printf(fmt, 'SHARE', 'USED', 'AVAILABLE'); run('cd /'); run('shares'); pools = choices('pool'); for (p = 0; p < pools.length; p++) { set('pool', pools[p]); projects = list(); for (i = 0; i < projects.length; i++) { run('select ' + projects[i]); shares = list(); for (j = 0; j < shares.length; j++) { run('select ' + shares[j]); share = pools[p] + ':' + projects[i] + '/' + shares[j]; printf(fmt, share, get('space_data'), get('space_available')); run('cd ..'); } run('cd ..'); } }
다음은 스크립트 실행 출력입니다.
SHARE USED AVAILABLE pond:projectA/fs1 31744 566196178944 pond:projectA/fs2 31744 566196178944 pond:projectB/lun1 21474836480 587670999040 puddle:deptA/share1 238475 467539219283 puddle:deptB/share1 129564 467539219283 puddle:deptB/share2 19283747 467539219283