読者です 読者をやめる 読者になる 読者になる

絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

linuxでバックグラウンド処理を便利にするコマンド+おまけ

追記2009/10/16: いくつか指摘を受けましたが、linuxでっていうかzshに結構依存してしまっています。
つい自分環境についてばっかり考える悪い感じw

書こうと思った発端。


"disownコマンド - Do You PHP はてな"


ことコマンドラインのTIPSに関しては、予想外な人が予想外な事を知らないものだ!と驚く事があります。


disownを知らなかったってことは、このへんももしかしたら知られてないかも?というバックグラウンド処理に関する豆知識(+おまけ)をいくつか。
知ってたらごめんなさいだけど、こういうのが需要あるってわかったら口に出して言ってみておくのは大事だよね!

1. しょっぱなからdisownした状態でバックグラウンド処理にする「&|」

いちいちバックグラウンド処理にした後にdisownするって2度手間が嫌な人に。
disownについては上記の記事参照。

% php example.php &|

こんな風に、「&|」すると、jobに入らずにいきなりdisownされた状態でバックグラウンド処理となります。

追記2009/10/16: id:shimookaさんの指摘で知りましたが、&!というのも存在するらしいです。man zshbuiltinsによると、&!も&|も同じものみたいです。
また、これはzshのみのようで、bashとかだとだめみたいでした。。。


まぁ、これを知らなくても

% php example.php & disown %1

ってつなげちゃえばほぼ同じなんですけどね。でも上のやり方の方がエレガントでしょ。

2. 処理の優先度を下げる「renice」

なんか裏で重いバッチ走らせつつ同じサーバ内で作業する、なんて時。
別にバッチの処理は明日までに終わっといてくれればいいよ。。。あんま処理食うなよ。。。
とか思ったら、reniceコマンドの出番。

% ps
  PID TTY          TIME CMD
17907 pts/2    00:00:01 zsh
18148 pts/2    00:00:00 tailf
18183 pts/2    00:00:00 ps
% renice 10 18148
18148: old priority 0, new priority 10

プロセスには優先度というものが存在していて、優先度が高いものほど多くのパワーを割いて処理します。
数字が小さい方が優先度が高く、その値は-20〜19まであります。-20が最優先、19という事です。通常は0です。*1


reniceコマンドは、既に実行中のプロセスの優先度を変更するコマンドで、上記のように新しく変更したい優先度と、対象のPIDを指定してあげます。
なお、通常ユーザの場合はreniceコマンドを使っても優先度を「上げる」事はできません。下げるだけです。優先度を上げたい場合にはroot権限でやってください。

3. しょっぱなから優先度を指定「nice」

紹介する順番がおかしいって?まぁまぁ。
まぁ、reniceで優先度の説明したから良いよね?優先度を下げた状態で起動できるんです。

% nice php example.php

こうすると、コマンドの優先度が10で起動します。*2
ちなみに、デフォルトは+10ですがオプションで指定もできます。マイナスが使えるのは、やっぱりrootだけですが。

4. バックグラウンド処理の決定版!「nohup」

バックグラウンド処理を放置して任せとく、って場合はnohupが最強ですw
まぁ、最近はscreen切り離しちゃう、って人も多いんでしょうが。

% nohup php example.php &

こうすると、nohup.outというファイルに標準出力とエラー出力をリダイレクトして、かつHUPを受け付けないようにした状態で「php example.php &」のプロセスが起動します。
*3


HUPで停止しないので、nohupしたコマンドは親のシェルからログアウトしても大丈夫!って感じになるので、わざわざdisownしなくてもいいのです。いちいちリダイレクトも指定しなくてもいいし、素敵><b。*4


余談ですが、シェルがログアウト時にHUPするのはシェルの設定の問題*5なので、例えばzshなら

setopt nohup

としておくと、HUPはしなくなります。こうなってればぶっちゃけdisownなんて必要ないです(w
でも、ttyが死んだ時は自分で頑張ってね(はぁと

おまけ. tailでログを流すのが大好きなあなたに。「tailf」

意外と知られてないな、と思う便利コマンドの代表格だったりするのがこのtailfコマンド。


みんな、screen開きまくってtail -fしまくりますよね?ですよねー。
そんな人は、このtailfコマンドを使えばtype数少なく、かつ軽量にtail -fできます。*6

# tailf /var/log/messages

もう、ただこれだけです。tailのエイリアスではないので、tailみたいにあれこれ高機能にはできません。でもtail -fでダダ流しするなら、tailfはtype数も少なくなってわりと素敵です。



なんか、ちょっとした発端からいくつか有名どころじゃね?とは思いつつ便利系のコマンドを紹介しました。
うーん、まぁ、常識だろ!って人はごめんなさい。知らなかった人には、お役に立てて良かったです!
ってな感じで。

*1:なお、&をつけて実行すると優先度は5になります。なので、実は &でバックグラウンド実行(5)するのと、Ctrl+Zしてbgするの(0)では、後者の方が優先度の高い状態で実行されます。

*2:なお、正確に言うと+10される、という感じです。先の注釈で書いたように、&で実行していた場合は元が5なので、niceすると15になるってことです。

*3:ちなみに、この記事を書くときにたまたまman nohupを見直して気付いたのですが、「スケジューリング優先度は 5 増やされるので、実行の割り当て時間はやや小さくなる。」という記述がmanにありましたが、これはちょっと嘘です。nohup自身は優先度は下げません。通常&をつけて実行されるのが半ば常識になっているために、&による優先度の変更をnohupの機能と勘違いされたのでしょうか。こういうのって、どこに報告すればいいんだろうね?

*4:ちなみに、nohupコマンドをリダイレクトすることで、出力先をnohup.outからそのリダイレクト先に変更できます。

*5:最近のbashなんかはデフォルトでHUPしないらしいです。zshはデフォルトでHUPします。

*6:とはいえ、最近のtailは進化してるらしく、tailfのアドバンテージはもうあんまりないらしいです。http://x68000.q-e-d.net/~68user/unix/pickup?tail