ユニケージ 開 発 手 法 コードレビュー USP 研 究 所 技 術 研 究 員 written by 大 内 智 明 Vol.25 ローカルホストからリモートホスト 上 のシェルスクリプトの 実 行 について 説 明 します 業 務 で 使 用 するサーバは ネットワーク 上 に 複 数 台 存 在 しています サーバ 内 で 起 動 する 処 理 は 自 身 で 処 理 が 終 了 する 場 合 もあれば 他 サーバとの 相 互 通 信 が 必 要 な 場 合 もあります 他 サーバとの 相 互 通 信 は 相 手 サーバ の 状 態 (データ 更 新 の 有 無 バッチの 開 始 / 終 了 など) を 確 認 したり 互 いのバッチプログラムを 実 行 したりし ます 今 回 紹 介 するケースは 自 サーバ 内 で 集 めたデー タを 相 手 サーバ(リモート 先 )に 転 送 して 相 手 サーバ 上 で 実 行 し 転 送 したデータを 相 手 サーバ 上 に 展 開 する シェルスクリプトになります( 図 1) ネットワークでつながったサ ーバ 間 では お 互 いにデ ー タの 通 信 やコマンド シェルスクリプトを 実 行 することが できます( 図 2) 補 足 パスワードなしでログインして 実 行 するには 公 開 鍵 の 設 定 が 必 要 に なります 図 1 サーバは 相 互 に 通 信 している ネットワーク 上 に 複 数 台 のサーバが 存 在 ネットワーク 同 士 は お 互 いの 状 態 を 確 認 した り データ 転 送 互 いのバッチプログラムの 実 行 を 行 います データ 転 送 相 手 サーバのプログラム 実 行 状 態 確 認 図 2 リモートホスト 上 のシェルスクリプトを 実 行 する ローカルホスト リモートホスト ローカルホスト リモートホスト ローカルホスト リモートホスト 作 成 配 信 A001 A002 B001 ❶ ローカルホスト 上 にデータを 作 成 する ❷ データをリモートホストに 配 信 する 実 行 ❸ ローカルホストから リモートホスト 上 の シェルスクリプトを 実 行 して データを 加 工 します ローカルホスト 上 に❶❷❸の 実 行 を 行 います ❸は リモートホスト 上 で 実 行 してデータ 加 工 します ローカルホストからリモートホスト 上 のコマンドを 実 行 する 方 法 ssh <リモートホスト> 実 行 コマンド 22 2016 April
リスト1 ローカルホストからリモートホスト 上 のシェルを 実 行 するシェル 1 #!/bin/ush -xve 2 # システム 名 :USPシステム 3 # サブシステム 名 : 仕 入 伝 票 4 # プログラム 名 :LV4 作 成 5 # 概 要 :LV3からLV4 作 成 < 親 シェル> 6 # 備 考 (Usage) : LV4MAKE.DAY.SIRE_DENPYOU [ 処 理 日 ] [ 店 舗 コードファイル] 7 # 作 成 日 :20xx/xx/xx 8 # 会 社 名 :Usp-lab 9 # 作 成 者 :xxx 10 11 #/////////////////////////////////////////////////////////////////////////////// 12 # 初 期 設 定 13 #/////////////////////////////////////////////////////////////////////////////// 14 < 中 略 > 15 16 #------------------------------------------------------------------------------- 17 # 変 数 の 定 義 18 #------------------------------------------------------------------------------- 19 tmp=/tmp/$$-$(basename $0)_$(date +%Y%m%d%H%M%S) # 一 時 ファイル 20 hostname="$(ghostname)" # サーバ 名 21 semd="${home}/ap/semaphore" # セマフォディレクトリ 22 lv3d=/home/data/lv3 # LV3ディレクトリ 23 ppid=$$ 24 sday=$(date +%Y%m%d) 25 apserver=$(msctrl -ctrl C -msflg M -job DENPYOAP -print host) # 伝 票 APホスト 名 の 取 得 26 27 # 引 き 数 の 確 認 28 [ $# -ne 2 ] && ERROR_EXIT 29 30 ymd=$1 # パラメータより 月 次 31 TenpoCdfile=$2 # 店 舗 CDのリスト 32 33 #/////////////////////////////////////////////////////////////////////////////// 34 # データ 処 理 部 35 #/////////////////////////////////////////////////////////////////////////////// 36 37 # ファイル 存 在 チェック 38 echo ${lv3d}/denpyou/??????/denpyo_header_siire/day/tbl/${ymd}.gz 39 ugrep -v '\?' 40 tarr 41 self 1 1.24.6 42 # 1:フルパス 2: 店 舗 CD 43 cjoin0 key=2 ${TenpoCdfile} - 44 self 1 45 xargs zcat 46 lineup 1 2 > $tmp-yyyymm_ten 47 # 1: 伝 票 年 月 2: 店 舗 コード 48 49 # ヘッダ 情 報 50 cat $tmp-yyyymm_ten 51 while read yyyymm tenpocode ; do 52 [! -f ${lv3d}/denpyou/${tenpocode}/denpyo_header_siire/dym/rireki/${yyyymm}.gz ] && continue 53 zcat ${lv3d}/denpyou/${tenpocode}/denpyo_header_siire/dym/rireki/${yyyymm}.gz 54 done 55 # 全 件 ヘッダから 最 新 伝 票 を 抽 出 する 56 awk '$(NF-2) <= "'${ymd}'"' 57 getlast 1 9 > $tmp-header.all.now ugrep はユニケージコマンド grep に 相 当 cjoin0はユニケージコマンド 画 面 1(P.26) 参 照 self はユニケージコマンド 指 定 したフィールドを 取 り 出 す lineup はユニケージコマンド 指 定 したフィールドのデータの ラインナップを 取 り 出 す getlast はユニケージコマンド 画 面 2(P.26) 参 照 ❶ 23
58 59 # 明 細 情 報 60 cat $tmp-yyyymm_ten 61 while read yyyymm tenpocode ; do 62 [! -f ${lv3d}/denpyou/${tenpocode}/denpyo_meisai_siire/dym/rireki/${yyyymm}.gz ] && continue 63 zcat ${lv3d}/denpyou/${tenpocode}/denpyo_meisai_siire/dym/rireki/${yyyymm}.gz 64 done 65 # 全 件 明 細 から 最 新 伝 票 を 抽 出 する 66 awk '$(NF-2) <= "'${ymd}'"' 67 getlast 1 10 > $tmp-meisai.all.now 68 69 # 伝 票 APサーバのAP/LV4 以 下 に 展 開 するためデータをコピー 70 scp $tmp-yyyymm_ten ${apserver}:/tmp < /dev/null # 1: 伝 票 年 月 2: 店 舗 コード 71 scp $tmp-header.all.now ${apserver}:/tmp < /dev/null # 仕 入 伝 票 ヘッダ 72 scp $tmp-meisai.all.now ${apserver}:/tmp < /dev/null # 仕 入 伝 票 明 細 73 # scpで 送 信 していても 74 # 配 信 先 のサブシェル 内 で 転 送 したファイルがないとエラーが 発 生 することがあるため 75 # すべてのscpがちゃんと 行 われるまでwaitで 待 つ 76 wait 77 #/////////////////////////////////////////////////////////////////////////////// 78 # 伝 票 APサーバ 内 のサブシェルを 実 行 79 #/////////////////////////////////////////////////////////////////////////////// 80 shl=lv4make.day.sire_denpyou_tenkai 81 dentenfile=$tmp-yyyymm_ten 82 sireheader=$tmp-header.all.now 83 siremeisai=$tmp-meisai.all.now 84 lv4maked=${home}/ap/denpyou/shell 85 86 # 配 信 先 でサブシェルを 起 動 87 ssh ${apserver} "${lv4maked}/${shl} ${ymd} ${dentenfile} ${sireheader} ${siremeisai}" < /dev/null 88 89 #/////////////////////////////////////////////////////////////////////////////// 90 # 終 了 91 #/////////////////////////////////////////////////////////////////////////////// 92 < 中 略 > ❶ ❷ ❸ リスト2 リモートホスト 上 で 実 行 されるシェル 1 #!/bin/ush -xve 2 # システム 名 :USPシステム 3 # サブシステム 名 : 仕 入 伝 票 4 # 業 務 名 : 仕 入 伝 票 5 # プログラム 名 :LV4 作 成 6 # 概 要 :LV3からLV4 作 成 < 子 シェル:LV4MAKE.DAY.SIRE_DENPYOUから 呼 び 出 される> 7 # 備 考 (Usage) :LV4MAKE.DAY.SIRE_DENPYOU_TENKAI [ 処 理 日 ] [ 年 月 - 店 舗 ファイル] [ 伝 票 ヘッダファイル] [ 伝 票 明 細 ファイル] 8 # 作 成 日 :20xx/xx/xx 9 # 会 社 名 :Usp-lab 10 # 作 成 者 :xxx 11 12 < 中 略 > 13 #------------------------------------------------------------------------------- 14 # 変 数 の 定 義 15 #------------------------------------------------------------------------------- 16 < 中 略 > 17 18 # 必 要 項 目 を 追 加 19 # 20 # 事 業 会 社 名 称 24 2016 April
21 cjoin2 +_ key=11 ${lv3d}/sonota/jgyk/tbl/jgykcd_jgykryaku ${headerdata} cjoin2はユニケージコマンド 画 面 3(P.26) 参 照 22 # 発 注 先 名 称 23 cjoin2 +_ key=7 ${lv3d}/hachubtryu/hachusaki/tbl/hachucd_hachunm - 24 # 仕 入 先 名 25 cjoin2 +_ key=6 ${lv3d}/hachubtryu/shiiresaki/tbl/shiirecd_shiirenm - 26 # 店 舗 名 27 cjoin2 +_ key=2 ${lv3d}/tenpo/tenpo/tbl/tenpocd_tenponm - 28 maezero 18.3 > $tmp-shire_header.new 29 30 ## 単 票 L4 31 # 32 # 必 要 項 目 を 追 加 33 cjoin2 +"_" key=16 ${tmp}-shohn_chubnr_cd_nm ${meisaidata} 34 maezero 9.3 35 maezero 10.5 36 maezero 11.3 > $tmp-shire_meisai.new 37 38 # LV4ファイルを 伝 票 年 月 店 舗 毎 に 一 時 置 き 39 # 40 # 伝 票 年 月 / 店 舗 CD 毎 でのまとめと 置 き 換 え 41 keycut $tmp-denpyo_header_siire.%1.%2 < $tmp-shire_header.new 42 keycut $tmp-denpyo_meisai_siire.%1.%2 < $tmp-shire_meisai.new 43 44 # 順 番 に 一 時 ファイルを 正 式 ファイルに 変 更 45 while read yyyymm tenpocode ; do 46 lockfile=${lv4d}/${tenpocode}/denpyo_header_siire/${yyyymm}.lock 47 48 mkdir -p ${lv4d}/${tenpocode}/denpyo_header_siire 49 mkdir -p ${lv4d}/${tenpocode}/denpyo_meisai_siire 50 51 # 伝 票 年 月 / 店 舗 CDで 排 他 処 理 52 if ulock --timeout=600 --invalid=0 ${lockfile} 53 then true 54 else HAITA_ERROR_EXIT 55 fi 56 # 排 他 制 御 の 解 除 を 行 う 際 に 自 プロセスを 使 用 57 echo ${ppid} > ${lockfile} 58 59 if [ -s $tmp-denpyo_header_siire.${yyyymm}.${tenpocode} ] ; then 60 # 一 覧 61 mv $tmp-denpyo_header_siire.${yyyymm}.${tenpocode} ${lv4d}/${tenpocode}/denpyo_header_siire/${yyyymm} 62 # 単 票 63 mv $tmp-denpyo_meisai_siire.${yyyymm}.${tenpocode} ${lv4d}/${tenpocode}/denpyo_meisai_siire/${yyyymm} 64 else 65 : > ${lv4d}/${tenpocode}/denpyo_header_siire/${yyyymm} 66 : > ${lv4d}/${tenpocode}/denpyo_meisai_siire/${yyyymm} 67 fi 68 69 # 更 新 完 了 後 に 店 舗 年 月 毎 にロックを 解 除 する 70 UNLOCK 71 done < ${ymtenpo} 72 73 # 一 時 保 存 先 のディレクトリを 削 除 74 rm -rf ${headerdata} ${meisaidata} ${ymtenpo} < /dev/null 75 76 #/////////////////////////////////////////////////////////////////////////////// 77 # 終 了 78 #/////////////////////////////////////////////////////////////////////////////// 79 < 中 略 > maezero はユニケージコマンド 画 面 4(P.26) 参 照 keycut はユニケージコマンド 画 面 5(P.26) 参 照 ulock はユニケージコマンド 画 面 6(P.26) 参 照 ❹ ❺ 25
画 面 1 cjoin0 画 面 4 maezero keyが 一 致 するデータを 出 力 $ cat master 0000003 杉 山 26 F 0000005 崎 村 50 F 0000007 梶 川 42 F $ cat tran 0000005 82 79 16 21 80 0000001 46 39 8 5 21 0000004 58 71 20 10 6 0000009 60 89 33 18 6 0000003 30 50 71 36 30 0000007 50 2 33 15 62 $ cjoin0 key=1 master tran 0000005 82 79 16 21 80 0000003 30 50 71 36 30 0000007 50 2 33 15 62 画 面 2 画 面 3 getlast 同 一 キーの 最 後 の 行 を 出 力 する $ cat data 0000007 セロリ 20060201 117 0000007 セロリ 20060202 136 0000007 セロリ 20060203 221 0000017 練 馬 大 根 20060201 31 0000017 練 馬 大 根 20060202 127 0000017 練 馬 大 根 20060203 514 $ getlast 1 2 data 0000007 セロリ 20060203 221 0000017 練 馬 大 根 20060203 514 cjoin2 キーがmasterと 一 致 するtranは master 項 目 を 付 与 する masterと 一 致 しないtranは ダミーデータを 付 与 する $ cat master 0000003 杉 山 26 F 0000005 崎 村 50 F 0000007 梶 川 42 F $ cat tran 0000005 82 79 16 21 80 0000001 46 39 8 5 21 0000004 58 71 20 10 6 0000009 60 89 33 18 6 0000003 30 50 71 36 30 0000007 50 2 33 15 62 $ cjoin2 +@ key=1 master tran > ok-data $ cat ok-data 0000005 崎 村 50 F 82 79 16 21 80 0000001 @ @ @ 46 39 8 5 21 0000004 @ @ @ 58 71 20 10 6 0000009 @ @ @ 60 89 33 18 6 0000003 杉 山 26 F 30 50 71 36 30 0000007 梶 川 42 F 50 2 33 15 62 前 にゼロを 付 ける $ cat data 12 345 6789 $ maezero 1.5 2.6 data 00012 000345 6789 画 面 5 keycut キーでファイル 分 割 する (キーについて 要 ソート) $ cat data 01 埼 玉 県 03 熊 谷 市 82 0 23 84 10 01 埼 玉 県 01 さいたま 市 91 59 20 76 54 02 東 京 都 04 新 宿 区 30 50 71 36 30 02 東 京 都 05 中 央 区 78 13 44 28 51 $ keycut data.%1 data $ ls -l data.* -rw-rw-r-- 1 usp usp 87 3 月 6 00:00 data.01 -rw-rw-r-- 1 usp usp 82 3 月 6 00:00 data.02 $ cat data.01 01 埼 玉 県 03 熊 谷 市 82 0 23 84 10 2ファイルに 01 埼 玉 県 01 さいたま 市 91 59 20 76 54 分 割 される 画 面 6 ulock 排 他 制 御 コマンド if ulock lock; then # # 読 み 書 きなどの 処 理 # rm -f lock fi lockファイルを 作 成 してから lockファイルを 削 除 するまで の 間 が 完 全 排 他 区 間 となっている 26 2016 April
リスト1 ローカルホストからリモートホスト 上 のシェルを 実 行 するシェル [1] デ ータを 集 める(リスト1:❶38 67 行 目 ) [2] 集 めたデータを 相 手 サーバ(リモートホスト)に 転 送 (リスト1:❷69 75 行 目 ) [3] リモ ートホスト 上 のシェルスクリプト(コマンド) 実 行 (リスト1:❸80 87 行 目 ) ユニケージ 開 発 では 中 規 模 以 上 の 業 務 システムを 開 発 する 際 には 業 務 単 位 で 複 数 台 のサーバに 分 けた 分 散 型 のシステムを 構 築 することがよくあります 分 散 型 の 場 合 には 共 通 データをそれぞれのサーバ 内 に 持 ち 合 っ ています( 共 有 ) 共 通 データを 持 つことは 自 身 で 作 成 したデータを 相 手 サーバ(リモート 先 ) 上 で 実 行 したい 際 に 同 じ 条 件 で 共 通 データを 使 用 して データの 展 開 を 行 うことができます リスト2 リモートホスト 上 で 実 行 されるシェルスクリプト [4] マスタ 項 目 を LV 4 デ ータに 付 与 (リスト2:❹33 42 行 目 ) [5] L V 4 を 更 新 ( リスト2:❺45 71 行 目 ) ローカルホストからリモートホスト 上 のスクリプトを 実 行 することは 高 負 荷 の 処 理 を 他 サーバへの 分 散 処 理 や データのリモート 先 への 展 開 といった ローカルホスト だけではできない 処 理 を 実 現 できます ユニケージには 共 有 と 固 有 の 考 え 方 があります 共 有 とは 同 じもののコピーがすべてに 行 きわたっている 状 態 固 有 とは 同 じものが1つにのみ 所 有 されている 状 態 01 02 コマンド 学 習 編 に 続 いて シェルスクリプト 学 習 編 発 刊! nicage software development method 実 践 ユニケージ 開 発 手 法 01 02 コマンド 学 習 編 ISBN 978-4-904807-30-9 本 体 3,500+ 税 B5 変 形 / 170 頁 本 書 は 独 特 な 方 法 でシステムを 構 築 するユニケージ 開 発 手 法 の 基 本 を 理 解 し 習 得 するための 実 践 教 材 です 対 象 となる 読 者 は 基 本 的 な UNIX/Linux の 知 識 ( 端 末 コマンド ファイルの 概 念 パス 標 準 入 出 力 リダイ レクションなど)がある 方 です ここでは ユニケージ 開 発 手 法 において 使 用 頻 度 の 高 いコマンドの 使 い 方 とくに grep コマンド sed コマンド awk コマンドをはじめとした 基 本 的 な UNIX コマンド usp Tukubai コマンド(ユ ニケージコマンド)について 詳 しく 解 説 します 豊 富 な 練 習 問 題 で 効 果 的 にコマンド 操 作 を 体 得 できます シェルスクリプト 学 習 編 ISBN 978-4-904807-31-6 本 体 3,500+ 税 B5 変 形 / 134 頁 本 書 は 独 特 な 方 法 でシステムを 構 築 するユニケージ 開 発 手 法 の 基 本 を 理 解 し 習 得 するための 実 践 教 材 です 対 象 となる 読 者 は 基 本 的 な UNIX/Linux の 知 識 ( 端 末 コマンド ファイルの 概 念 パスなど)があること また ユ ニケージ 開 発 手 法 01 コマンド 学 習 編 の 内 容 を 理 解 している 方 です ここでは コマンド 学 習 編 で 学 んだコマ ンドを 組 み 合 わせて データ 処 理 を 行 うシェルスクリプトの 作 成 に 必 要 な bash の 文 法 や 機 能 について 学 習 し ユ ニケージの 作 法 にしたがってシェルスクリプトでプログラミングを 行 う 練 習 も 行 います http://www.usp-lab.com/pub.html 27