UNIXでは、複数のコマンドを組み合わせて色々なことが出来るような思想になっている。
何かのコマンドを実行し、そのコマンドが標準出力と標準 エラーに出力する内容をファイルと画面(標準出力)に表示する例。
% 何かのコマンド 2>&1 | tee ファイル
何かのコマンドを実行し、そのコマンドが標準出力に出力した内容の先頭1項目を画面(標準出力)に表示する例。
% 何かのコマンド | cut -f 1 -d' '
% 何かのコマンド | awk '{print $1}'
特定位置に出てくる文字列の種類の個数を数える例。[2007-10-25]
% cut -c桁 ファイル | sort | uniq | wc -l
% tar -c ディレクトリ | gzip > dir.tar.gz % gzip -cd archive.tgz | tar -xC 展開先ディレクトリ
ディレクトリ「/usr/include」配下でC言語のヘッダーファイル(拡張子h)の全ファイルから文字列を含むファイルを検索する例。
xargsを使うと、パイプで渡された内容が引数として扱える。
$ find /usr/include -name "*.h" | xargs grep 検索文字列
バッククォート又は$付きの丸括弧でくくると その中が先に実行され、標準出力に出力された内容が引数として扱われる。
$ grep 検索文字列 `find /usr/include -name "*.h"` $ grep 検索文字列 $(find /usr/include -name "*.h")
findの-execオプションを使うと、見つけたファイル毎に指定したコマンドが実行される。
$ find /usr/include -name "*.h" -exec grep 検索文字列 {} \;
特定のコマンド名のプロセスが実行されているかどうかを調べる例。[2008-05-17]
% ps -elf | grep COMMAND | grep -v grep
psでプロセス一覧を表示し、COMMANDという文字列がある行だけをgrepで絞り込む。
ただしそれだけだと、タイミングによってはgrepコマンド自身のプロセスも表示されてしまう。
そこで、さらに「-vオプションを付けたgrep」を実行することにより、grepを含む行は除外している。
だから、調査したいコマンド(文字列)の中に“grep”という語があったらダメだろうけど…あまりそういう例は無いと思われるが、ありそうな時は気をつけるべし。
psで表示される端末名(TTY)を見てwhoで探せば、どこのIPアドレスから接続しているユーザーか調査できる。
% ps -ef | head -1
UID PID PPID C STIME TTY TIME CMD
% ps -ef | grep java
hoe 11491 1 0 4月 27 ? 0:05 java Loop
hoe 18212 1 0 21:12:57 pts/7 0:00 java Sample
↑TTYが「?」になっているのは、以前telnetからバックグラウンドで実行してtelnetは切断したもの。
% who
hoe pts/16 4月 28日 19:31 (192.168.0.2)
zzz pts/17 4月 28日 19:57 (192.168.0.3)
hoe pts/7 4月 28日 20:03 (192.168.0.3)
コマンドを実行する際に末尾に「&」を付けるとバックグラウンドで実行される。[2012-03-04]
$ sleep 1m &
バックグラウンドで実行したかったのに「&」を付け忘れた場合は、一旦Ctrl+Zで止め、bgでバックグラウンドに変更できる。
$ sleep 1m ←実行後にCtrl+Zを押す [1]+ Stopped sleep 1m $ bg [1]+ sleep 1m &
しかし、(環境設定にもよるが、)実行している端末(term・telnet等)を閉じると、バックグラウンドで実行していたコマンドも終了してしまう。
終了させない為には、端末を閉じた際に各コマンドに送られるSIGHUP(ハングアップ)シグナルを無視すればよい。
nohupを使ってコマンドを実行すると、SIGHUPが無視されるようになる。
$ nohup sleep 1m &
nohupを付けずに実行開始してしまった場合は、disownでSIGHUPを無視するように出来る。
$ sleep 1m & $ jobs [1]+ Running sleep 1m & $ disown -h %1