ちょっと悩んだので、メモ。
-tttt オプションを付ける。「t」を4つ
1 |
# tcpdump -nn -i eth0 -tttt |
-wで保存したファイルを後で読むとき(-r)も便利
1 2 3 |
# tcpdump -nn -i eth0 -w hoge.dump # tcpdump -nn -tttt -r hoge.dump |
前の記事で、disownの素晴らしさを紹介したが、基本的に標準出力・標準エラーを諦めることになる。
調子の悪いHDDの丸ごとコピーとかだと、標準エラーを後で見たいので、なんとかならないかネット検索したところ、
gdbで接続して、dup2で標準出力・標準エラーをファイルに繋ぐなんて荒業を紹介している人がいた。
dup2なんてCプログラマじゃなきゃ使おうとも思わんな。
流れとしては、
うーん。絶対忘れる。
以下、サンプル。実際はcpとかでやると思うが今回は、標準出力と標準エラーが分かりやすいようにしている。
標準出力にはdateの結果、標準エラーにはerrorを5秒間隔で。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
$ bash -c 'while /bin/true ; do date ; echo error >&2;sleep 5; done ' 2014年 8月 12日 火曜日 12:16:25 JST error Ctrl-z # 一旦止める。 $ bg # バックグラウンドにする。 $ disown %1 # ここまででプロセスの準備OK。出力があるので、一度ログアウトして入り直した方がいいかも。 $ ps axfwww |grep while 8458 ? S 0:00 \_ bash -c while /bin/true ; do date ; echo error >&2;sleep 5; done # プロセスID確認 今回は、8458 $ touch /tmp/std{out,err} # ファイルを作る # # gdbで繋ぐ。ubuntuだと設定にもよるがsudoが必要。 # $ sudo gdb -p 8458 ###### snip ######## (gdb) p dup2(open("/tmp/stdout",1),1) # 標準出力を繋ぐ (gdb) p dup2(open("/tmp/stderr",1),2) # 標準エラーを繋ぐ (gdb) detach # デタッチ (gdb) quit # gdbを終了 # 確認する $ tail /tmp/stdout 2014年 8月 12日 火曜日 12:25:08 JST 2014年 8月 12日 火曜日 12:25:13 JST 2014年 8月 12日 火曜日 12:25:40 JST $ tail /tmp/stderr error error error |
うーん。非常にメンドイ。なるべくnohupを使いましょう。それか日常的にscreenを使いましょうってことですね。
ただ、考え方は非常に面白いので、覚えておくのはいいと思う。
軽い気持ちで実行したコマンドが、なかなか終わらなくて、あー。もー。帰りたいのに終わるまで帰れない。
なんて経験があったりする。ただこの disown ってコマンドを覚えておけば、そんなことを気にしないで実行したまま家に帰ることが出来る。
たぶんbash限定かもしれないけど、自分bashしか使わないので。。。
具体的には、
Ctrl-z でプロセスを一旦止めて、
bg でバックグラウンドプロセスにして。
って感じ。
ただこのままログアウトしても大丈夫なプロセスもあったりするのだが、止まるやつは止まる。
そこで、 disown %1 を実行してあげる。(%1はjob id jobsコマンドで確認出来る)
これでログアウトしても止まらないはずなので、安心して帰れる。
以下サンプル(cpの大量コピーとかがよくあるかと)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ cp -av /media/usb-hdd my-bkup/ Ctrl-z # ここで一旦止める。 $ bg # バックグラウンドにする。 $ jobs [1]+ 実行中 cp -av /media/usb-hdd my-bkup/ & # job idを確認。ここでは%1 $ disown %1 $ jobs # 自分のjobから消えてればOK |
こんな感じ。標準出力するプログラムだと、入力が大変だが、めげずに実行する。
ログアウトすると、標準出力、標準エラーは保存できないので、そこは諦めるか別の方法。
最初から、時間がかかるのがわかっているなら、 nohup を使ったほうが良い。標準出力もファイルに保存されるので。
nohupの記事も過去にちょろっと書いた。
diffでファイルの比較とかやってると、実行するコマンドの結果(標準出力)を元に比較出来ないのかなと悩むことがある。
一度ファイルに落としてからdiffすればいいので、特に調べてなかったが、ちょいと調べたらあっさり見つかった。
コマンドの標準出力を比較する場合。
1 |
$ diff <( command1 ) <( command2) |
うわ。めっちゃ簡単。bashだけらしいけど、bash以外使った事ないから充分。
<(の間にはスペースは入れてはだめ。
コマンドの標準出力とファイルを比較する場合。
1 |
$ diff <( command1 ) file1 |
diffに限らず
1 |
<( command ) |
こいつは、いろんなところで使えそう。
無知は罪ですな。
極極々まれに、特定のホストと通信できなくて、MTUを調整すると通信できたりすることがある。
MTUは通常回線終端のルーターで設定しておけば、特に問題になることはないのだが、たまーーーーに変なホストがいる。
そのたまーーーーーにいる変なホストのためだけにルーターをイジるのは、馬鹿げているし、Linuxマシンもサーバだったりすると
全体に影響するような設定は嫌なので特定のルーティングに対してだけ設定を行う。
んでこんな設定
1 2 3 4 5 6 7 |
# 特定のホスト $ sudo route add -host 192.168.210.1 mss 1000 gw 192.168.0.1 # ネットワークブロック $ sudo route add -net 192.168.210.0 netmask 255.255.255.0 mss 1000 gw 192.168.0.1 |
route コマンドだとMTUじゃなくMSSの設定になる。
って、route はもはや古いコマンドだと書いたので、
iproute2では
1 2 3 4 5 6 7 |
# 特定のホスト $ sudo ip route add 192.168.210.1 mtu 1000 via 192.168.0.1 # ネットワークブロック $ sudo ip route add 192.168.210.0/24 mtu 1000 via 192.168.0.1 |
iproute2 だとMTUの設定になる。
なんでこんなことが必要か?とか、MTUとMSSの違いって何?とか思ったら、MTU, MSS, Path MTU Discoveryとかでgoogle先生に聞けば教えてくれると思う。
これ系のトラブルは、ハマると泣きそうになる。
sshのポート転送をこよなく愛しているのだが、ログインするまでもなくポート転送したい時がある。
単純に、Aサーバのこのポートを、Bサーバのあのポートに接続するって場合。
socatってコマンドがあれば、なんとか出来る。
1 |
$ socat TCP4-LISTEN:8443,fork TCP4:foo.example.com:443 |
自分の:8443ポートを、foo.example.com:443に繋ぐ。
forkを付けないと、1回の接続でコマンドが終了してしまう。
これで、自分の8443に接続が来ると、foo.example.com:443に接続されるっていうすぐれもの。
ただ、このsocatって一番困るのが、たぶん大体の環境で入ってない。
netcatのncコマンドなら、たぶん何処の環境でも入ってるので、力技でやると、
以下のような感じ。ただ、fifoを事前に作って上げる必要があります。
1 2 3 |
$ mkfifo foo.fifo $ nc -l 8443 < foo.fifo | nc foo.example.com 443 > foo.fifo |
標準入出力をfifoで繋いであげる感じ。
この考えはとても素晴らしいのだが、仕様なのかなんなのか、そこそこの頻度でコマンドが終了する。
もー。ようわからんので、whileで回してやる。
1 |
$ while /bin/true ; nc -l 8443 < foo.fifo | nc foo.example.com 443 > foo.fifo ; done |
かなり強引。動作テスト程度には使えるが、本気運用は無理ですね。
別にubuntuに限った話では無いのだが、USB HDDケースを買った。
最近のLinuxなら、USB-HDDは特に意識することなく認識するので、
そんな悩む必要も無いのだが、無駄に悩みまくって、最終的にこいつを買った。
同じセンチュリーの裸族のお立ち台シリーズにしようかと思ったのだが、
スライドして差し込めるタイプのこいつの方が、使い勝手がよさそうなのでこいつにした。
以下、良い点。
金額的にも、機能的にも大満足。別に不満では無いが気になるところを強いて言うと
ちなみに一緒に買ったHDD。
なんか最近Western Digitalばっかりだな。もちろん簡単に認識した。
ただ、今回3TのHDDを初めて買ったのだが、昔から持っていた、SATA-USB変換ケーブルだと、認識してくれない。
今回買ったHDDケースもう一個買ってもいいかな。
logresolveコマンドのpython版を作った時に知ったので、メモを残す。
内容は表題のとおり。
以下2パターンがある模様。
1 |
# python -u logresolve.py |
1 2 3 |
import sys print "Hello world." sys.stdout.flush() |
すぐ忘れそう。。。
前に、同じ記事を書いたが、なんかubuntuをアップグレードした影響なのか、ちょっと挙動が変わった。
前は、標準入力に渡してあげると、順次変換が実行されていたのだが、今は、まとめて結果が表示される。
多少遅くても、実行時眺めていたかったので、それならpythonで作ればいいやんと思ってとてつもなくと汚く書いた。汚い!!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#!/usr/bin/env python import sys import socket if hasattr(socket, 'setdefaulttimeout'): socket.setdefaulttimeout(1) def line_get_host(line,before_lines, before_host): lines = line.split(' ') before = before_lines.split(' ') if (lines[0] != before[0]): try: host = socket.gethostbyaddr(lines[0])[0] except: host = lines[0] else: host = before_host lines[0] = host new_lines = " ".join(lines) return new_lines, host if __name__ == '__main__': argvs = sys.argv argvc = len(argvs) if ( argvc == 2): of = open(argvs[1], 'r') else: of = sys.stdin before_line = "" before_host = "" for l in sys.stdin: l = l.rstrip('rn') ret = line_get_host(l,before_line, before_host), print ret[0][0], sys.stdout.flush() before_line = l before_host = ret[0][1] |
ファイル名を渡すか、標準入力で渡すかのみです。
1 2 |
sys.stdout.flush()を書かないと、オリジナル版と同じように、 まとめ表示になってしまって、結局同じかい!とツッコんでしまった。 |
1 |
$ tail -50 access_log | logresolve.py |
オリジナルも同じだが、逆引き出来ない時の、タイムアウト時間がちょっと長くて
こっちでは短くしたかったのだが、結局面倒で(実力が無くて)やめた。
ふと、ffmpegを使おうと思ったら、
1 2 |
$ ffmpeg ffmpeg: コマンドが見つかりません |
あれ、コマンドが無いって言われている。バージョンアップ前にバリバリ使ってた覚えがあるので絶対入っていたはず。
そういえば、ffmpeg時代に、コマンド実行時に、「なんか名前変わるよ」的な警告が出ていた気がする。
うーん。新しい名前が思い出せない。
ちょいと調べたところ、
avconv
になったそうです。今のところオプションとかの違いはなさそう。というかそんなにffmpegを使わないのでわからない。
ちなみにubuntuでのパッケージは、
libav-tools
1 2 |
$ dpkg -S /usr/bin/avconv libav-tools: /usr/bin/avconv |
うーん。ますます忘れそう。