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のオプションの違い
unicorn
とunicorn_rails
はほとんど同じ挙動をして、
application serverを立ち上げてくれますが、一部オプション指定の意味が違います。
ちょっとハマったので書いておくことにします。
結論
unicorn
のオプション-E
はRACK_ENV
を設定unicorn_rails
のオプション-E
はRAILS_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_rails
でgrepしてます。
ということで、よく調べてみると、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_ENV
をunicorn実行前に設定するようにしてたわけです。
こんな感じで
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よりも安定 いくつかのファイルシステムをオーバーレイしてマウントできる。 スナップショット的にも使える。