毎回忘れるのでメモを残す
スレッドを表示したい
-L
オプションを使うと良い
ps -efL
特定のカラムでソートしたい
--sort
オプションを使うと良い。カラム名の前に-
を付けると降順になるデフォルト昇順。
ps auxwwww --sort=-%mem | head
毎回忘れるのでメモを残す
-L
オプションを使うと良い
ps -efL
--sort
オプションを使うと良い。カラム名の前に-
を付けると降順になるデフォルト昇順。
ps auxwwww --sort=-%mem | head
最初に結論
hostname -I
を使うと良い
某所で、自ホストのIPアドレスを取得するためにこんなことをしている箇所を見つけたのが発端です。
LANG=C /sbin/ifconfig | grep 'inet addr' | awk '{print $2;}' | cut -d: -f2 | grep -v 127.0.0.1 | tail -n 1
もう少し、簡潔にできないかなー。(そもそもifconfigはもう使わない方が良いし) ip addr show eht0
とかでもデータ加工しないとだめだしな。とか考えてたら、hostname
でできそうだということが分かりました。
似たオプションで、-i
と-I
があるのですが、名前解決ができるかできないかの違いです。用途に合わせて使い分けましょう。
-i, --ip-address
Display the network address(es) of the host name. Note that this works only if the
host name can be resolved. Avoid using this option; use hostname --all-ip-addresses
instead.
-I, --all-ip-addresses
Display all network addresses of the host. This option enumerates all configured
addresses on all network interfaces. The loopback interface and IPv6 link-local
addresses are omitted. Contrary to option -i, this option does not depend on name res‐
olution. Do not make any assumptions about the order of the output.
LANG=C /sbin/ifconfig | grep 'inet addr' | awk '{print $2;}' | cut -d: -f2 | grep -v 127.0.0.1 | tail -n 1
闇感ある。
— masasuzu.lab (@masasuz) February 1, 2016
hostname -I | head -1
かなー。場合に依るけど。
— masasuzu.lab (@masasuz) February 1, 2016
hostname -I と hostname -i の違いを覚えた。
— masasuzu.lab (@masasuz) February 1, 2016
デーモン管理はUpstartでやっていて、Webアプリケーションサーバはwebapp-${project_name}
、ジョブワーカーはjobworker-${project_name
みたいな感じの名前で定義しています。
serviceコマンドはrootじゃないと実行出来ないのですが、デプロイのときなど、大量のサーバにいちいちパスワード打てないので、特定のユーザにNOPASSWORDで実行出来るようにします。
ただ、何も考えず/etc/sudoers
に設定していくとサブコマンド毎に指定していかないといけないのでなかなか辛いです。
app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_1 restart app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_1 reload app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_1 stop app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_1 start app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_2 restart app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_2 reload app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_2 stop app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_2 start app ALL=(root) NOPASSWD: /usr/bin/service jobworker-project_1 restart app ALL=(root) NOPASSWD: /usr/bin/service jobworker-project_1 reload app ALL=(root) NOPASSWD: /usr/bin/service jobworker-project_1 stop app ALL=(root) NOPASSWD: /usr/bin/service jobworker-project_1 start
かといって、こうしてしまうと、全てのUpstart管理のデーモンをパスワード無しで操作出来てしまうのでかなり危険です。
app ALL=(root) NOPASSWD: /usr/bin/service
なんかうまい方法無いかなとsudoersのmanpageを引いていたらワイルドカードが使えるらしいので、こうしてみました。 これなら権限を絞りつつ、記述も簡潔になって良い感じです。
app ALL=(root) NOPASSWD: /usr/bin/service webapp-* * app ALL=(root) NOPASSWD: /usr/bin/service jobworker-* *
※ この記述あくまで一例だからこのまま使ってることを意味しないです。念為
env.host
を使うと良い。hostによって配るcrontabが違っていて、レポジトリ的には ${HOSTNAME}.crontab
みたいな感じでhost名を含むファイル名で置いてあるときに、どうしたらうまく配れるかなと考えた結果 env.host
で実行中のhost名が取れるのでそいつを利用した。
from fabric.api import sudo, env from fabric.decorators import task @task def some_task(project): src = "/opt/%s/config/crontab/%s.crontab" % (project, env.host) dst = "/etc/cron.d/%s" % project sudo("if [ -e $src ];then cp %s %s; fi" % (src, dst))
今まで、ワークツリーにいちいち移動してから、gitの操作してたんですが、 --git-dir
で指定してあげればその必要も無いという知見を得ました。
今まではこうしてたのを、
cd /path/to/repos/
git log
こうしてあげることで、ディレクトリの移動が必要無くgitの操作ができます。
git --git-dir=/path/to/repos/.git --work-tree=/path/to/repos/ log
古めのgitは上記の方法じゃないとダメなんですが、1.8.5からは -C
オプションが使えるようになってるので、こちらを利用した方が良いです。
git -C /path/to/repos/ log
べんり。
そういうのを昔どっかで聞いて、ネタじゃないの?とか思って居たんですが、ふとさっき思い出して、試してみたら、普通にcheckoutできた。
% svn checkout https://github.com/masasuzu/resume A resume/branches A resume/trunk A resume/trunk/README.md Checked out revision 5.
commitもできる。
% svn commit -m 'cpan => CPAN' Authentication realm: <https://github.com:443> GitHub Password for 'masasuzu': Committed revision 8.
なるほど。ちゃんと反映されてる
svnだから特定のディレクトリからチェックアウトするということもできるので、使いようによっては便利かも。
※そもそも、サポート対象外のディストリビューションのバージョンなので、ちゃんと動くかどうかはまったく保証出来ません。
※前提として、awsコマンドインストール済みで、CodeDeployなどの各種設定済みであること
Ubuntu12.04でaws deploy install
しようとするとruby2.0が無いのでインストール失敗します。
E: Unable to locate package ruby2.0 E: Couldn't find any package by regex 'ruby2.0' Installing the AWS CodeDeploy Agent... ERROR Command '['apt-get', '-y', 'install', 'ruby2.0']' returned non-zero exit status 100 Install the AWS CodeDeploy Agent on the on-premises instance by following the instructions in "Configure Existing On-Premises Instances by Using AWS CodeDeploy" in the AWS CodeDeploy User Guide.
そこで、brightboxのレポジトリにruby2.0があるので、追加してあげた後にインストールしてあげると、うまくCodeDeploy-Agentがインストールできます。
apt-get install python-software-properties add-apt-repository ppa:brightbox/ruby-ng apt-get update apt-get install ruby2.0 aws deploy install --config-file codedeploy.onpremises.yml --override-config --region ap-northeast-1
ひとまず、動いている模様です。
# service codedeploy-agent status The AWS CodeDeploy agent is running as PID 18324 # tail -F /var/log/aws/codedeploy-agent/codedeploy-agent.log 2015-11-25 15:50:00 INFO [codedeploy-agent(18708)]: master 18708: Spawned child 1/1 2015-11-25 15:50:01 INFO [codedeploy-agent(18708)]: Started master 18708 with 1 children 2015-11-25 15:51:01 INFO [codedeploy-agent(18712)]: [Aws::CodeDeployCommand::Client 200 61.042376 0 retries] poll_host_command(host_identifier:"arn:aws:iam::1234:user/deploy") 2015-11-25 15:52:03 INFO [codedeploy-agent(18712)]: [Aws::CodeDeployCommand::Client 200 61.021466 0 retries] poll_host_command(host_identifier:"arn:aws:iam::1234:user/deploy")
https://aws.amazon.com/jp/codedeploy/pricing/
1台に対して1回デプロイする毎に$0.02かかる ざっくりの計算だと、1日あたり20回くらいデプロイがあるとし、各プロジェクトの平均台数が30台とする。 これを計算すると1日当たり$12。
1ヶ月20営業日換算ですると$240
$1 == 120円で計算すると、28800円。
これに追加して、s3などの使用料金がかかかる。 なお、6ヶ月間の無料枠にはAWS CodeDeployは含まれてはいない模様。
http://aws.amazon.com/jp/free/
月あたり約3万円をどう取るか。AWSにあるインスタンスに対してデプロイするときは1台当たりの$0.02というのはかからない。 要はAWS移行しろとのAWSからの思し召しだ。