課題 解決策 対策概要 発生状況 対策詳細 所感 注意 参考 課題 subprocessモジュールを利用して外部のシェルスクリプトを起動することがある。そのシェルスクリプトにおいて子プロセス(バックグラウンドプロセスなど)が動作している最中に、subprocessで設定したtimeoutが発生した。このとき、直接起動したシェルスクリプトのプロセスはkillされるが、その子プロセスは残存しているようだ。timeoutが発生した際には子プロセスも含めてkillしたいがどうすればよいか。 解決策 対策概要 起動するプロセスを別のセッションとして管理し、python の timeout 例外 catch において、プロセスグループ ID に対してkill する。 発生状況 最初に「課題」の状況が発生する様子を示す。以下のようなスクリプトを用意した。シェルスクリプトでは(subprocessで設定し
B! 6 0 0 0 前に作った shell-logger というシェルスクリプト用ロガーツールをアップデートして Traceback機能を付けたりしてみました。 shell-logger コマンドラインで使う シェルスクリプトの中で使う Traceback 各種設定 shell-logger shell-logger: シェルスクリプトで良い感じにログアウトプットを管理する etc/shell-logger.sh</del>/etc/shell-logger**というファイルを読み込むと debug, info, notice, warn, errと言った関数が使える様になります。 追記: 2022/08/07 現在はshell-loggerとshを取った名前になっています。 追記ここまで インストールはcurlを使って $ curl -fsSL https://raw.github.c
初級者向けに『自分がシェルスクリプト書くときに気をつけていること』をまとめてみました。 @masudaKの『シェルスクリプトを書く際に気を付けていること8箇条』の乗っかりエントリです。 内容は重複しないように書いてますので合わせて読んでください! 基本的にLinuxの/bin/sh、/bin/bashを想定しています。 テキスト処理は標準入力から受け取って標準出力に出す テキストを扱う小さなツールを作りましょう。 引数はオプション情報を渡すのに使います。 そうすればgrep、sort、uniqなどの便利なコマンドとパイプで連携できます。 grep ERROR /tmp/test.log | my_cmd1.sh 192.168.1.1 | sort 全てを実行する1つのスクリプトを作るのはたいへんだし、応用が効かないです。 人間に伝えたいメッセージは標準エラー出力に出す パイプでつないだ時
概要 YAMAHAルータ RTX系のNAT変換セッショ値を Linuxサーバからcronでシェルスクリプト回して5分ごとの値を取得する。 シェルスクリプトの内容 ・expectコマンド(対話型)を使ってルータにアクセスし、必要情報を取得 ・取得したテキストを加工して、セッション値、日付等を取り出し。 準備 ・expectコマンドのインストール yum install expect ・ルータ内のコマンド NATの動作状態確認 show nat descriptor address all ルータ環境確認 show enviroment サンプル ※cronで回すので、シェルは絶対パスで書く。 ルータにアクセスして必要情報を取得するシェル(rtxnat.sh) 参考: expectコマンドの使い方 – No:158 – Linuxで自宅サーバ構築(新森からの雑記) #!/bin/sh #---
ソフトウェアのテストはたいへんだなあ ソフトウェアのテスト、きちんとしてますか?最近は、スマートフォンやタブレットの普及に伴って、ユーザが使うデバイスの種類が多様化しています。 使われるOSやブラウザ、画面サイズの種類が増える中、プリキュア1の多様化も著しいですね。「プリキュアで学ぶワンライナーWebスクレイピング」で検証した通り、昨年までは43人、今年は「魔法つかいプリキュア」が加わることで、プリキュアの数は総勢45人になりました2。プリキュアはキャラクターによって専用デバイスを持ったり3、感情が昂ぶると常識を覆す事象を起こしたりするので、ITサービスを提供するエンジニアの方々は、ユーザ満足度向上のため、当然プリキュアがユーザになった場合も考慮した動作テストをされていると思います。 とはいえ、プラットフォームとプリキュアの組み合わせの数は、既にかなりの数です。全てのパターンを試すととても
困った時はすぐQiitaを始めとしたTipsを表面的に鵜呑みにし、使えそうなプロダクトを拾ってきてマニュアル通りに対応するプロダクト至上主義者達よ。そんなことでは、想定外の事態に見舞われた時すぐ死ぬぞ。想定外とは、マニュアルには載ってないから想定外なのだ。マニュアル通りにしか動けぬ者は、典型的なコンビニ店員の如く薄給に喘ぐだけ。頭を使え!UNIX哲学に目覚めよ!そしてPOSIX原理主義を崇拝せよ! Follow
SMTPサーバの接続確認をする際、テストメールを送信することがあります。 最初のうちはtelnetコマンドを手で叩いて確認してましたが、だんだん面倒になってきたので、シェルスクリプト化してみました。 内部ではncコマンドを叩いているので、ncがない場合別途インストールしてください。 base64のエンコードはこのあたりからどうぞ。 # !/bin/bash host=メールサーバホスト port=ポート番号(25、465、587とか) user=SMTP認証のユーザ名(base64エンコードしたもの) pass=SMTP認証のパスワード(base64エンコードしたもの) to=宛先メールアドレス from=送信元メールアドレス function mail_input { echo "EHLO localhost" sleep 1 echo "auth login" echo "$user"
LinuxやUNIXを使う上で、ある程度使えると非常に便利な置換コマンドが、このsedコマンドだ。 今回は、このsedコマンドで覚えておきたい使い方について紹介する。 なお、今回の置換・編集の例として、以下のファイルを用いて説明する。 [root@test-centos7 work]# cat /root/sed_test.conf # line 1 line1=enable # line 2 line2=disable # line 3 line3=enable # line 4 line4=enable 1.基本的な使い方 sedコマンドの基本的な使い方としては、以下のようにコマンドを実行することでファイル・標準出力の内容で文字列の置換を行う事だ。 なお、条件の最後に「g」を付けないと、"最初に、マッチした箇所のみ"置換するので注意。 ファイルの内容を置換する場合 sed 's/置換前
ruby1.8.5しか入っていないサーバでメール送信するスクリプトを書くことになった。 rubyでメール送信するときはponyを使うと便利なので愛用していたのだけど、ruby1.8.5では最新版が動かない。シンタックスエラーが出まくる。*1 github.com 古いバージョンの中から動くものを探すのもいいかもしれないが、すごい手間が掛かりそう。依存ライブラリも含めてすべてのGemを調べる必要がある。 そんなことをするよりもsystem関数でsendmailコマンドを叩いてやったほうが早いかと思い、以下のスクリプトを書いた。 mime-typeがcsv固定になってたり汎用性は無い。 ほぼ、以下のシェルスクリプトの書き写し。qiita.com まあ最新の環境が用意できるのが一番いいのだけど。そうもいかない場合もある。こういう基礎は大事だと思った。*2 *1:->記法とか{key:val}記法
■ sedでも対応してみる awkの$3は3つあることを確認している。 つまりsedでも3個あることを確認すればいい。 フィールドが3個ということは区切りは2個なので/ .* /でok。 % seq 100|xargs -n3|sed '/ .* /s/[^ ]*$/Fizz/'|xargs -n5|sed '/ .* .* .* /s/[0-9]*$/Buzz/'|xargs -n1 ちょっと不恰好だけど、正規表現で条件を書けばいける。 ■ readの挙動 while read lineで読んでいるときに最終行に改行がないとループを抜けてしまう。 だが、read自身はちゃんとlineへ反映させているのであった。 % bash -c 'echo -n foo | while read line; do echo $line; done' % bash -c 'echo -n foo | {
DoRuby! (ドルビー!) は現場のエンジニアによる、主にRubyなどの技術に関する様々な実践ノウハウを集めた技術情報サイトです。 find コマンドの -mtime オプションを指定することで最後にデータが修正された日時で検索することができます。 日時の指定方法も色々あるのですが、個人的にわかりづらかったので以下のパターンだとどのような結果になるのか、実際に動かしてみることにしました。 試すパターン find -mtime 日数 find -mtime +日数 find -mtime -日数 結果からいうと、 find -mtime -3 3日(72時間)前〜現在 find -mtime 3 3日(72時間)前〜4日(96時間)前 find -mtime +3 4日(96時間)前〜過去 こうなります。 とりあえず、確認用のファイルを適当に作って試してみます。 touch -t 07
Unixの上でsed, awk, Python, Perl などを使ってファイルを行ごとに扱うためには、各行は LF という文字コード(\n)で区切られていないといけない。しかし、他のシステムで作られたファイルは異なる改行コードを用いているため、一旦unix用の改行コードに変換する必要がある。 1.改行コードの調べ方 1.A nkfを使う nkfを入れてあれば、Terminalから次のように打つだけ。 $ nkf -g foo.txt 1.B Octal dump 例えば、foo.txtというファイルを調べたければ、Terminalを開いて次のようにする。 $ od -c foo.txt | less 表示される文字の中に混じっている\n や\r\nを見つけ、下の表と比べる。 システム改行コードod -c での見え方
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く