shell script

なんかshellって忘れやすいので色々メモ

特殊変数

shellでもperlでもrubyでもいいんだけど、 特殊変数という、たとえば、$1みたいな変数がある。

これを特殊変数というんだけど、 特殊変数という言葉を良く忘れて、ググれなくなったりする。

特殊変数とちょっと関係ありそうな奴。

$#

$@

$*

$0

$1 から $9

shift はまたあとで書く。

$? 最後に実行した結果がはいってる。

$$ プロセス番号

$-

$!

IFS 区切り文字

環境変数

もちろん、もってますよね。実行ユーザがいるんだから。

envとかprintenvとかdeclareでみれる。

消したいときは、

export -n ENV_VAR

で、変数名ごときえて、中身だけ消したければ、

export ENV_VAR=

とかやる。

ファイルネームまわり

ファイルパスの文字列からいろいろ取得するためのもろもろ

FILE_PATH="/etc/httpd/httpd.conf"
 
# ファイル名を取得
FILE_NAME=${FILE_PATH##*/}

# 拡張子を取得
EXT=${FILE_PATH##*.}

# 拡張子を除いたファイル名
FILE=${FILE_NAME%.*}
 
# ディレクトリ名を取得
DIR_NAME=${FILE_PATH%/*}
# もしくは
DIR_NAME=`dirname ${FILE_PATH}

良くあるかきかたとして、今実行しているファイルの絶対パス

ABS_PATH=$(cd $(dirname $0);pwd)

関数

つーか変数の話でいうと、関数の中で宣言した変数もそのままだとグローバル変数になっちゃうので、

hoge() {
    local VALUE='aaaa'
}

みたいに、localをつけて宣言する。

ちなみに、read_onlyを付けると定数を作れる。

local read_only VALUEとかやれば、ローカルの定数。

returnは普通のshellを実行したときの終了ステータスになるから、0から255。 返り値が欲しいときは、echoしたりする。実行側で上手く使う例えば、こんな感じ

hoge() {
    local VALUE='aaaa'
    echo ${VALUE}
}

HUGA=`hoge`

引数は特殊変数とshiftをつかって取得する

外部ファイルのよみだしとか

関数があるとファイル分割したくなるんで、ファイル読み出しは、

sourceかもしくは、.をつかう、 たとえば、

source 'unlearned.sh'

みたいな。

unicornとunicorn_railsのオプションの違い

unicornunicorn_railsはほとんど同じ挙動をして、 application serverを立ち上げてくれますが、一部オプション指定の意味が違います。

ちょっとハマったので書いておくことにします。

結論

  • unicornのオプション-ERACK_ENVを設定
  • unicorn_railsのオプション-ERAILS_ENVを設定

参考: http://unicorn.bogomips.org/

経緯1

Capistrano 3を導入しまして、unicornを使っていたので無邪気に

を使っていました。(僕の環境では0.3.2) 普通に動かしていたんですが、muninがunicornのmemory statusをうまく取得できていないようでした。

該当のmuninのplugin

pluginに目をちゃんと通すとわかるんですが、

   def memory_usage
      result = { :master => {master_pid => nil}, :worker => {} }
      ps_output = `ps auxw | grep unicorn_rails`
      ps_output.split("\n").each do |line|

なるほど。unicorn_railsgrepしてます。

ということで、よく調べてみると、sepastian-capistrano3-unicornのデフォルトでは unicornを使ってunicornプロセスを起動していて、このままではこのunicorn_memory_status に引っかからないわけです。

ということで、unicorn立ち上げをunicorn_railsを通して実行する必要があるわけですがこれはわけなく行えます。 sepastian-capistrano3-unicorn は、unicorn_binというパラメータを用意してまして、これのデフォルトがunicornになっているわけなので、ここを変更する。

RAILS_ROOT/config/deploy.rbに下記記述を追記します。

set :unicorn_bin, ->{"unicorn_rails"}

(ラムダで囲んでんのは特に深い意味は無いんですが、評価時にいろいろ変更するようなモノが多いので念のため標準的にこうするようにしています。)

とここで世界は平和に終ると思っていました。

経緯2

unicornの時の-EパラメータがRACK_ENVであるということは理解していたので、RAILS_ENVunicorn実行前に設定するようにしてたわけです。 こんな感じで

RAILS_ENV=hogehoge; unicorn -E development .....

僕はVM上でrailsを動かすコトが多くて、vmというRAILS_ENVをつくっていました。 しかしunicorn_railsに変更してみたら、僕のVMで急にunicornが立ち上がらなくなりました。

RAILS_ENV=vm; unicorn_rails -E development .....

どうも、dababase.ymlにadapterの指定がない的なエラーがはかれていて、おかしーなーと思ったんです。 と、ここで気付きました。

-Eオプションが、RAILS_ENVを上書いていることを。

んで、下記をみた

なるほどね。

以上!

Rackのステータスコードとシンボルの表

ちょっとブックマークとかでも、あとでなんて検索したらいいかわからなくなりそうなので、メモしておく

下記のブログの抜粋です。

status code description symbol
100 Continue :continue
101 Switching Protocols :switching_protocols
102 Processing :processing
200 OK :ok
201 Created :created
202 Accepted :accepted
203 Non-Authoritative Information :non_authoritative_information
204 No Content :no_content
205 Reset Content :reset_content
206 Partial Content :partial_content
207 Multi-Status :multi_status
226 IM Used :im_used
300 Multiple Choices :multiple_choices
301 Moved Permanently :moved_permanently
302 Found :found
303 See Other :see_other
304 Not Modified :not_modified
305 Use Proxy :use_proxy
306 Reserved :reserved
307 Temporary Redirect :temporary_redirect
400 Bad Request :bad_request
401 Unauthorized :unauthorized
402 Payment Required :payment_required
403 Forbidden :forbidden
404 Not Found :not_found
405 Method Not Allowed :method_not_allowed
406 Not Acceptable :not_acceptable
407 Proxy Authentication Required :proxy_authentication_required
408 Request Timeout :request_timeout
409 Conflict :conflict
410 Gone :gone
411 Length Required :length_required
412 Precondition Failed :precondition_failed
413 Request Entity Too Large :request_entity_too_large
414 Request-URI Too Long :request_uri_too_long
415 Unsupported Media Type :unsupported_media_type
416 Requested Range Not Satisfiable :requested_range_not_satisfiable
417 Expectation Failed :expectation_failed
422 Unprocessable Entity :unprocessable_entity
423 Locked :locked
424 Failed Dependency :failed_dependency
426 Upgrade Required :upgrade_required
500 Internal Server Error :internal_server_error
501 Not Implemented :not_implemented
502 Bad Gateway :bad_gateway
503 Service Unavailable :service_unavailable
504 Gateway Timeout :gateway_timeout
505 HTTP Version Not Supported :http_version_not_supported
506 Variant Also Negotiates :variant_also_negotiates
507 Insufficient Storage :insufficient_storage
510 Not Extended :not_extended

尊敬し合える議論っていいよね

僕は原発は無い方がいい派です。

しかし、原発無くしたい人たちが、原発再稼働賛成の人を罵倒したりしているのを、 ネットで見ていたりするのをみると不快です。

同様に、原発再稼働賛成の人が、原発反対の人を、わかってないバカみたいな感じで扱うのも気分が悪くなります。

また、どちらの陣営に関してもですが、仲間うちで 敵対勢力をバカにしたような感じで同調しあう感じのやり取りが苦手です。

もちろんほとんどの人は礼儀正しくやっているのでしょうが、 角が立っている人がやっぱり目立っていて嫌です。

お互いリスクとメリット、歴史的な背景や、感情論も含めたところを 鑑みて、自分の立ち位置決めてるんですし もうちょっと言葉を選んでもらえないかなーと思う次第です。

重要なことなので、言葉尻で感情的になるべきじゃないと思うので。

実際、日本に住めなくなっちゃった場所が出来たのも事実。 また、雪降りゃ電気足りなくなるのも事実。 どっちも大変なことです。

自分と違う意見の人を大切に扱えるかどうかは、 民主主義や現代の社会を生きるのに必要な資質と思います。

という気持ちになった、建国記念日の夜です。

インストールしたgemはどこにあるのか

ほとんどはbundlerさんのおかげで明確なわけですが、普通にgem installしたらばどこに入ってるのか、知りたくて気持ち悪くなりました。

まー単純にgemのコードを読みたくなったって話なんですが。

gem environment

を実行すると、わかりました。僕の場合、以下のように出ました。

RubyGems Environment:
  - RUBYGEMS VERSION: 2.0.6
  - RUBY VERSION: 1.9.3 (2013-06-27 patchlevel 448) [x86_64-darwin12.4.0]
  - INSTALLATION DIRECTORY: /Users/unlearned/.rbenv/versions/1.9.3-p448/lib/ruby/gems/1.9.1
  - RUBY EXECUTABLE: /Users/unlearned/.rbenv/versions/1.9.3-p448/bin/ruby
  - EXECUTABLE DIRECTORY: /Users/unlearned/.rbenv/versions/1.9.3-p448/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-darwin-12
  - GEM PATHS:
     - /Users/unlearned/.rbenv/versions/1.9.3-p448/lib/ruby/gems/1.9.1
     - /Users/unlearned/.gem/ruby/1.9.1
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
     - :ssl_verify_mode => 0
  - REMOTE SOURCES:
     - https://rubygems.org/

これで、GEM PATHSのところを探れば良いわけですね。 簡単です。

ruby 2.1.0インストール、gemにも

インストールをrbenvを使ってするんだけど、 gemも一気に入れ替えてみる。

$ rbenv install -l          # インストール可能なバージョンを調べる

$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" 

$ rbenv install 2.1.0

$ rbenv install 2.1.0      # インストール
$ rbenv global             # 現在グローバルでのバージョン表示
$ gem list --no-versions > /tmp/gemlist # 今までつかってたrubyのgemのリスト
$ rbenv global 2.1.0 # グローバルで使用するrubyに設定
$ rbenv rehash
$ gem install `cat /tmp/gemlist`
$ rbenv rehash

インフラまわりのメモです。

なんか最近、言葉をすぐ忘れてしまったりするのでメモです。

chefspec

chefのcookbookのテストをRspecで書ける

serverspec

サーバーのインストールや、コンフィグレーションのテストをRspecで書ける

Docker

VMみたいなもん。linux上で複数のlinuxを動かせる。 システム分離にLinux Containers(LXC)、ファイルシステムにAdvanced multi layered unification system(Aufs)を使っていて、軽量

Linux Containers(LXC)

仮想マシンではなくて、個別のプロセスとネットワークスペースを作り出す仮想環境。 chroot的な?

Advanced multi layered unification system(Aufs)

ユニオンマウントができて、UnionFSよりも安定 いくつかのファイルシステムをオーバーレイしてマウントできる。 スナップショット的にも使える。