Linuxの並列バッチ処理ができたらいいな

バックグラウンド処理に関して話題になっているらしい.

バックグラウンド処理について

 $ command &                    # バックグラウンド処理
 $ jobs                         # バックグラウンドで走るジョブの確認
 $ disown %n                    # ジョブ番号nをデーモン化する
 $ command &|                   # デーモン化したバックグラウンド処理
 $ nice [-n N] command args..   # コマンドのプライオリティを指定して実行(PCのカクつき防止)
 $ renice N PID                 # 指定したプロセス番号のプライオリティをNに変更
 $ nohup command &              # SIGHUPを受け付けない(シェルの終了後でも走る).標準出力・エラーをnohup.outにリダイレクト

などが以下に挙げられていました.
linuxでバックグラウンド処理を便利にするコマンド+おまけ - 絶品ゆどうふのタレ

色々他に知ってるtipsを挙げてみましょう.

top コマンド

topコマンドを知らない人は少ないと思いますが,
現在PC上で走っているプロセス一覧を表示してくれるコマンドです.

topにはreniceを行う機能があり,psでPIDを調べてreniceを行うより簡単です.
topのインタラクティブ画面で"u"で特定ユーザのプロセスのみを表示するようになります.
"r"でrenice,"k"でkillを行うことができます.

ionice

niceで低優先度にしているのにシェルが重いなんて時に
バックグランドプロセスのIO入出力によりシステム全体がIOビジーに陥っている場合があります.

そんな時にIOのniceとしてioniceコマンドます.
三種類のプライオリティがあり
RealTime, BestEffort,Idleがあり,
一般ユーザはBestEffortとIdleが使用できます.
BestEffortではその内部でプライオリティが0-7で指定できます.
Idleは他のRTやBEのプロセスのIOが無いときのみIOの使用権が割り当てられます.

 $ ionice -c 3 -p PID              # PIDのIOをIdle時のみ行うようにする
 $ ionice -c 2 -n N command args.. # コマンドをIOプライオリティNに指定する.

xargs

最近のCPUはマルチコアが一般的でCPUを酷使するバッチプロセスを複数動かしたいが,
同時実行はコア数に制限したい(コンテキストスイッチのコスト抑制)場合GNU版xargsが使用できます.
Pオプションで同時実行数を指定し,nオプションで引数の数を指定できます.

以下のようなファイルを用意し

1 2 3 4 5
6 7 8 9 0
5 4 3 2 1
0 9 8 7 6

xargsを実行すると

$ cat args | xargs -P 2 -n 4 ./hoge foo bar foobar
#以下のコマンドが実行される
./hoge foo bar foobar 1 2 3 4 5
./hoge foo bar foobar 6 7 8 9 0
./hoge foo bar foobar 5 4 3 2 1
./hoge foo bar foobar 0 9 8 7 6

上記のコマンドの場合,同時実行2プロセスで実行されます.

最終的にはxargsをniceやrenice,screen,nohupと組み合わせて実行することになります.