Custom Search

JITAKU_SVR_Wiki

xargs

xargsの使い方は基本的には引数に渡すことができるコマンド、という感じ。

例)

# cat test
a
b
c
これを引数にしたい場合、一番簡単なのがxargs。

使い方

# cat test | xargs echo
a
b
c

上記を踏まえ以下へ続く。
たくさん使い方があるので、それぞれ紹介。

複数の同じプロセスを一気にkillする

例えばhttpdがハングアップしてしまい、プロセスの再起動が出来ないような状態になった場合、
killコマンドで一つずつプロセスを殺す必要がある。
しかし、ものすごく大量のプロセスがあった場合かなり困難。
(しかも大抵急ぐことが多い)
そんな時にはxargsに渡して一気にkillさせる。

# ps -ef |grep httpd | awk '{ print $2 }' | xargs kill



複数の引数を取りたい

xargsに渡す引数を1つだけではなく2つ以上取りたい場合

例)ファイルをコピーする。リストにはコピー元とコピー先が書かれたファイルがある

# cat list
/home/a /home/b

# cat list | xargs -n2 cp -p
デフォルトで改行やスペースの入ったファイルは別引数として扱うため、-nで区切りを示してあげる。
上記例だと、/home/a と /home/bが別々の要素として見られてしまうので、エラーとなる。

コマンドを別プロセスで複数実行させたい

一つのスクリプトでコマンドを羅列しても、上から順次処理をしてしまうので、複数行あるスクリプトだと、最後まで終わるのに時間がかかってしまう。

例)

# cat tar.sh

#!/bin/bash

tar cf /home/a.tar /usr/a
tar cf /home/b.tar /usr/b
tar cf /home/c.tar /usr/c

このスクリプトだとa.tarを作成し、完了次第b.tarを始める。
当然c.tarは最後に作られることになってしまうので、サーバリソースを上手に使えていないと思える。

これを別プロセスとして実行させられると、当然処理も早くなる(サーバリソースに余裕がない場合にはこの限りではないので注意)

# vim list

/home/a.tar /usr/a
/home/b.tar /usr/b
/home/c.tar /usr/c
/home/d.tar /usr/d
/home/e.tar /usr/e
/home/f.tar /usr/f
/home/g.tar /usr/g
/home/h.tar /usr/h
/home/i.tar /usr/i
/home/j.tar /usr/j

# cat list | xargs -n2 -P5 tar cf
オプション説明

-nについては上記の参照。

-Pはいくつのプロセスを同時実行させるかを指定する。
上記であれば5と書くことで5個を同時に処理させ、終われば次の処理に入る。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-12-17 (木) 17:32:54 (648d)