Browse Tag: linux

xargs のちょっとした Tips

xargs を使うと手軽にコマンドを並列実行できて便利ですが、xargs を使ったいくつかのちょっとした Tips を紹介したいと思います。

基本は、次のようなになります。


$ echo a"\n"b | xargs -t -P 2 -n 1 echo "command"
echo command a
command a
echo command b
command b

この例だと、”command (a|b)” を表示するコマンドになりますが、echo をとることで任意のコマンドの末尾に自由にパラメータを渡すことができます。

末尾ではなく、コマンドの途中のパラメータを渡したいときは、次のようにするとできます。


$ echo -e a"\n"b | xargs -t -P 2 -n1 -I '{}' echo "command {} param2"
echo command a param2
command a param2
echo command b param2
command b param2

-I オプションを使うと、任意のパラメータに置換することができます。上の例だと、{} になります。xargs に渡すパラメータが改行区切りでないといけないので注意してくさい。
そのままやってしまうと、次のようになります。


$ echo a"\n"b | xargs -t -n1 -P 2 -I '{}' echo "{} command"
echo a b command
a b command

ちゃんとコマンドを並列実行する場合は、GNU Paralell を使うのが定番ですが、インストールする必要があるので、お手軽にやりたいときには xargs を使うと便利です。

# 10/19 追記
コメントにあった指摘で、-P オプションを付与するように修正しました。

CentOS 7 で起動時と終了時にそれぞれ1回だけ実行するスクリプトを作成する

CentOS 7 で起動時と終了時にそれぞれ1回だけ実行するスクリプトを作成する方法を紹介したと思います。
次のような systemd スクリプトを作成します。


cat << EOF > /usr/lib/systemd/system/my-oneshot.service

[Unit]
Description=my-oneshot
After=network.service
Before=shutdown.target
Requires=network.service

[Service]
Type=oneshot
ExecStart=/bin/bash -v ‘/usr/local/bin/my-up.sh’
ExecStop=/bin/bash -v ‘/usr/local/bin/my-down.sh’
RemainAfterExit=true

[Install]
WantedBy=multi-user.target
EOF

次に systemd をリロードして、サービスを有効・開始します。


$ sudo systemctl daemon-reload
$ sudo systemctl enable my-oneshot
$ sudo systemctl start my-oneshot

これで、起動時には /usr/local/bin/my-up.sh が実行されて、終了時には /usr/local/bin/my-down.sh が実行されます。
もちろん、EC2 上でも利用可能ので、AutoScaling 時などに起動あるいは終了時に実行したいコマンドがあるときに設定すると便利ですよね。

Fluentd s3 + ローカルファイルに出力する設定の紹介

このエントリは、Fluentd Advent Calendar 2015 – Qiita の 4 日目のエントリです。当日、勝手にエントリしています。

今日は、最近実施した非常によくある構成 Fluend 経由で s3 + ローカルファイルに出力する設定を本番環境(※ただし、正式本番稼働前)で設定したので、どこにもある情報ですが、一緒に設定された設定ファイルの例がなかなかなかったので紹介してみます。

OS は、CentOS 7 になります。td-agent は、公式の方でインストール します。

やりたいことしては、S3 のバケット上に、「YYYY/MM/DD/HH/タグ1_タグ2」ファイルとして出力して、ローカルファイルにも同じディレクトリ構成のファイルで、同時出力することになります。

まず、設定ファイルですが、次のようになりました。

<source>
  type forward
  bind 127.0.0.1
  port 24224
</source>

<match hoge.**>
  type copy

  <store>
    type forest
    subtype s3
    <template>
      id hoge-s3-${tag_parts[1]}
      path ${tag_parts[1]}/

      aws_key_id <AWS_ACCESS_KEY_ID>
      aws_sec_key <AWS_SECRET_ACCESS_KEY>
      s3_bucket hoge-bucket
      s3_region <AWS_DEFAULT_REGION>
      format json
      s3_object_key_format %{path}%{time_slice}_%{index}.log
      store_as json

      time_slice_format %Y/%m/%d/%H/${tag_parts[1]}_%Y%m%d%H%M_${tag_parts[2]}
      flush_interval 60s
      flush_at_shutdown true

      buffer_type file
      buffer_path /var/log/td-agent/.s3-${tag_parts[1]}_%Y%m%d%H%M_${tag_parts[2]}.log
      buffer_chunk_limit 64m
      buffer_queue_limit 32

      num_threads 1
    </template>
  </store>

  <store>
    type forest
    subtype file_alternative
    <template>
      id hoge-file-${tag_parts[1]}
      path /var/log/td-agent/${tag_parts[1]}/%Y/%m/%d/%H/${tag_parts[1]}_%Y%m%d%H%M_${tag_parts[2]}.log
      symlink_path /var/log/td-agent.log
      dir_mode 0750

      time_slice_format %Y%m%d%H%M
      flush_interval 0s
      flush_at_shutdown true

      buffer_type file
      buffer_path /var/log/td-agent/.${tag_parts[1]}_%Y%m%d%H%M_${tag_parts[2]}.log
      buffer_chunk_limit 64m
      buffer_queue_limit 32

      num_threads 1
    </template>
  </store>
</match>

プラグインは、設定ファイルから分かるとおり、fluentd-plugin-forestfluent-plugin-file-alternative、が必要なので、td-agent-gem 経由でインストールしておきます。


$ sudo /opt/td-agent/usr/sbin/td-agent-gem install --no-ri --no-rdoc fluentd-plugin-forest fluent-plugin-file-alternative

ここでちょっとハマったのは、ローカルファイルへ出力する file_alternative の実際の出力ファイルが「/var/log/td-agent/.YYYY/MM/DD/HH/ファイル名」となってしまって、/var/log/td-agent 以下とみるとドットディレクトリとしてしまったところでした。上の設定で、正しくファイルが出力されています。

これから、この環境で本番稼働前のベンチマークを実施して、buffer まわりのパラメータ、thread の調整などを行ってみるつもりです。

今回、監視まわりは Datadog を使っているので、別のエントリーで紹介したいと思います。

su で expect を使って簡単に root になる方法

exepct 便利ですよね。expect を使うと、コマンドラインの対話を自動的に行うことが出来ます。

例えば、/home/foo/password に su のパスワードが書かれている場合、次のようなスクリプトを作成して実行すると一発で su することができます。


#!/usr/bin/expect -f

set password [exec cat /home/foo/password | head -1 | tr -s " " | cut -d " " -f 2]

spawn su -
expect "*assword:" { send "$password\r" }

interact

ポイントは、set で exec を使ってコマンドラインの実行結果をパスワードに入れているところ、上記の例であと /home/foo/password には複数行で各ユーザごとのパスワードがかかれていて、1行目に root のパスワードが書かれていることになります。
そして、interact で処理を継続しているところがポイントです。

また、expect 用のスクリプトを一から手動で作成するのは、すこし不便ですが、autoexpect を使うと expect を使うスクリプトを自動生成することができて便利です。
例えば、上記の expect のもとを作成する場合には、次のようにします。


$ autoexpect -c su
autoexpect started, file is script.exp
Password:
foo# exit
exit
autoexpect done, file is script.exp
$

そうすると、カレントディレクトリ以下に script.exp というファイルが生成されています。このファイルには、制御コードなどを含まれていたり、たくさんの分かりやすいコメントがかかれているので、ちゃんと整理して expect なスクリプトを作成すると便利です。

Oracle JDK をダウンロードするスクリプト

Oracle JDK のアップデートがあるたびに、それぞれのサーバに手動で Oracle の JDK ダウンロードページからダウンロードするのがめんどくさいので、即興のシェルスクリプトを書いてみた。

JDK 7 および 8 の、Linux x64 版の rpm と tar.gz に対応しています。

もちろん、事前にダウンロードする際には、BCL For Java SE に同意の上、使用してください。

また、当然のことながら、Oracle JDK ダウンロードのウェブページが変わってしまった場合は動作しないので、その旨割り切ってお使い下さい。

RHEL / Centos / Ubuntu のセキュリティ情報のまとめ

日頃から業務などで利用している Linux のディストリビューションのセキュリティ情報は、日々チェックして、日々運用していく必要がありますよね。

なので、日頃から使っている各 Linux のディストリビューションのセキュリティ情報の入手先をまとめてみました。

RHEL

それぞれのバージョンごとに公式ページに Errata として情報がとまってますが、RSS はないようですね。

RHEL5 系

RHEL6 系

CentOS

CentOS は、基本的に RHEL ベースなので、RHEL のアップデート情報元にセキュリティアップデートなどが行われているはずです。
セキュリティアップデートなどの情報は、CentOS-announce mailing list に投稿されているので、このメーリングリストを購読すればいいでしょう。

あと、非公式だとは思いますが、LWN.net にも CentOS security alerts が公開されていました。

その他、yum コマンドでも、次のようにすると確認することができます。

$ sudo yum install yum-security
$ sudo yum list-security
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* epel: ftp.kddilabs.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
epel/updateinfo | 509 kB 00:00
FEDORA-EPEL-2014-0446 bugfix PyYAML-3.09-10.el5.x86_64
FEDORA-EPEL-2014-0792 bugfix glances-1.7.4-1.el5.noarch
FEDORA-EPEL-2014-0531 security libyaml-0.1.2-6.el5.x86_64
list-security done

yum-security も便利ですよね。

Ubuntu

Ubuntu は、公式ページに Ubuntu Security notices が公開されています。
リリースごとにフィルターでもできて、RSS もあって便利です。
例えば、12.04 LTS (precise) は、ここになります。

Amazon Linux AMI

最後に最近 Amazon Linux AMI を使っている人も多いかと思いますが、Amazon Linux AMI Security Center に情報がまとまっています。

普段の運用の中でセキュリティアップデートは、かなり重要な業務になるので、怠らずにしっかりとやりたいですよね。

CentOS / Ubuntu でパワーセーブなどを無効にするスクリプト

CentOS や Ubuntu で、サーバやローカルの仮想マシンとして構築したとき、自動的にディスプレイのパワーセーブに入ってしまいますよね。
そこで、それらを無効にするスクリプトを作成しました。

このファイルを、/etc/init.d/setterm で作成して実行権限をつけておきます。

ついでに、端末の背景色・前景色も設定してみました。

CentOS の場合は、次のような感じで登録しておけば便利です。

# chkconfig --add setterm
# chkconfig setterm on

Ubuntu の場合は、次のような感じでしょうか。

# update-rc.d setterm defaults

ただ近い将来、/etc/init.d/ がなくなるので、あまり長くは使えないとは思えます・・・。

LVM で、論理ボリュームを拡張する方法

最近、LVM でディスクパーティションを作成していたりしています。

今まで 論理ボリュームを拡張するとき具体的なサイズを指定したのですが、VG の空き領域をすべて拡張したいときが多かったのですが、次のように指定すればいいことが分かりました。

$ lvextend -L +100%FREE /dev/mapper/vg/root

これは、かなり覚えにくい記述方法ですが、便利ですね。

あとは、ext3 なら resize2fs、ext4 なら resize4fs すれば完了ですね。

$ resize4fs /dev/vg/root

LVS DSR で、リアルサーバの設定を見直したお話

今までずっと LVS DSR で、リアルサーバでは iptables に、次のようなルールを追加した REDIRECT していましたが、iptables のオーバーヘッドが気になったので、lo:0 を定義するように変更してみました。


*nat
: PREROUTING ACCEPT [0:0]
: OUTPUT ACCEPT [0:0]
: POSTROUTING ACCEPT [0:0]
-A PREROUTING -d VIP -j REDIRECT
COMMIT

1.lo:0 を定義する

$ sudo vi /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=VIP
NETMASK=255.255.255.255
ONBOOT=yes

2. lo:0 を起動する

$ sudo ifup lo:0

3. sysctl を変更する、net.ipv4.netfilter.ip_conntrack_max の設定は不要なのであわせて削除する

$ sudo vi /etc/sysctl
# Ignore ARP
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

4. sysctl の設定を再読み込みする

$ sudo sysctl -p

5. iptables を停止する

$ sudo service iptables stop
$ sudo chkconfig iptables off

# 負荷的には、ほとんど変わらずといった印象、iptables を無効にすることで SSL の場合とかにリアルサーバ側で REDIRECT できないことが唯一の欠点かと思いますが、リアルサーバ側で ip_conntrack の設定に悩まなくて済むのはいいことだと思いますねぇ。

Ubuntu 12.10 で、svn 1.6 をインストールする方法

ご存じのとおり、Ubuntu 12.10 は svn 1.7 系なのですが、どうしても svn 1.6 系をインストールしたいことがあったので、設定してみました。

まず、/etc/apt/sources.list.d に precise のリポジトリを追加します。

precise-archive-source.list
deb http://us.archive.ubuntu.com/ubuntu precise main universe

あとは、ざっくりとインストールスだけですね。ポイントは、subversion パッケージは libsvn1 に依存しているところですね。
あと、バージョン指定をする必要がありますね。

$ sudo apt-get update
$ sudo apt-get install libsvn1=1.6.17dfsg-3ubuntu3 subversion=1.6.17dfsg-3ubuntu3
$ svn –help
usage: svn [options] [args]
Subversion command-line client, version 1.6.17.

Ubuntu のパッケージを確認するには、このサイトがかなり便利ですね。