fc2ブログ
プロフィール

けい

Author:けい
公開したWebサービス・アプリ一覧はこちら

※2014年12月、私が個人で開発したWebサービス・アプリへの
累計アクセス数は8億を超えました。
負荷対策頑張ります。日々精進していきます!!


■■■ 業務経歴 ■■■
社会人1年目:携帯電話開発。画面周りを1年間
2年目 :海外向け携帯電話ミドルウェア開発
     ブラウザとプロトコルスタック周り
2年目後半~:携帯電話の通信専用チップ開発
3年目:カーナビ。画面周りの開発
3年目後半~:BDビデオカメラ
     組み込みLinux カーネルと
     ドライバの開発。
4年目12月:プロジェクト途中で退社
~ここまではC、またはC++で開発~

~ここからJavaがメインの開発~
4年目1月:Web系の会社に転職
       ~4ヶ月間の研修
5年目5月:製造業向け生産管理システム開発
6年目9月:証券会社向けシステム開発
7年目10月~携帯電話向けコミックサイトの運用・開発
8年目12月:プロジェクト途中で退社

~ここからPHPがメインの開発~
8年目1月~仲介手数料が無料の不動産屋の社内SEに転職
交渉しほぼ完全に裁量労働が可能な立場になる。
業務内容はシステム全般ですが、
最近はSEO対策の作業が多いです。
現在14年目 まだ、しばらくはこの会社に居るつもりです。

あと、全ての記事がリンクフリーです。

最近の記事

過去ログ

全ての記事を表示する

全ての記事を表示する

カテゴリー

FC2カウンター

RSSフィード

cronからexpect を使ってみて、色々と逃げながら実装した

私の会社では運用補助ツールとしてteratermのマクロを使っています。
私が入社してからは運用で使用頻度が多い対話的処理などは殆どマクロ化し
なるべく運用にかかるコストを下げるように自動化をどんどん進めました。

ただ、クリティカルな部分ではどうしてもteratermのマクロは信頼できず
あくまで運用補助としての使い方が主な使い方でした。
信頼性という意味ではローカルのwindowsで動くプログラムは、
サーバー側のcronで動くものとは比べられないからです。


そしてサーバー側で対話的な処理を行うのであれば、
expectを使うことが一般的です。
expectはtclという言語仕様を用いており、
この言語仕様が昔からあるプログラムの割りには、
一癖も二癖もある言語なのです。

web上で情報を探してみたところ
比較的簡単なサンプルはあるものの、
本格的な記載を行っているページは以下くらいでした。

・expectで自動化


上記のページは本当によく書かれています。
おそらく数十時間は試行錯誤したのでは無いかと思われます。


ただ、私は結局の所、いくつかの問題の完全な解決策は
見つけることができませんでした。
また、もしexpectで困った場合にはネット上では情報は見つからないので、
tclの言語仕様を見たほうが良いです。


具体的に解決できなかった点は以下になります。

・以下のように標準入力「<」を使用する方法を見つけることができなかった
mysql < filename.sql

・expectのブロック内でシェル変数を呼び出すことがうまく行かなかった
以下を試しても全てうまく行かなかった。
send $aaa
send "$aaa"
send \"$aaa\"
send \"\$aaa\"




私はいくつかの問題が解決できなかったため、
cronからbashを呼び出し、対話的な処理のみexpectファイルを読み込むという
あまり綺麗とは言いがたい解決策を用いています。
シェルとexpectが混ざっていると、問題の切り分けがやりにくいこと、
特にクォーテーション、ダブルクォーテーション絡みの挙動の違いで
長時間悩んだたためです。

以下にとりあえず問題を突破するのに成功した、
mysqlのインポートスクリプトを書いておきます。



#!/usr/bin/expect

# タイムアウトを無制限(-1 )に設定する
set timeout -1

# [lindex $argv 0]は本プログラムが呼ばれた際の1番めのパラメータである。
# [lindex $argv] ならば全てのパラメータ
set command00 ""
append command00 mysql <\ [lindex $argv 0] "\n"

# spawn で管理するプロセスをシェルにしている
# spawn では標準入力、パラメータ、パイプ、リダイレクトなどが
# 正常に渡らず、実行できないプログラムが多かったため、
# 起動したいmysql ではなくシェルを起動している。
# 常にシェル起動したほうが無難な気がする
spawn /bin/sh
expect "sh-3.2"

# sendならば特に標準入力、パラメータ、パイプ、リダイレクトの制限が無いようである。
send $command00
expect "Enter password"




また、参考情報ですがデバックする際にはcronの起動ログは /var/log/cron
詳細ログは /home/ユーザー/mbox に入ります。

以上、参考になれば幸いです。

スポンサーサイト



コメント(0)   2013.09.07    [ Myカテゴリ:技術の話 ]
Template Designed By
ぐらいんだぁ