disownしたプロセスの標準出力や標準エラーを後から保存する

前の記事で、disownの素晴らしさを紹介したが、基本的に標準出力・標準エラーを諦めることになる。

調子の悪いHDDの丸ごとコピーとかだと、標準エラーを後で見たいので、なんとかならないかネット検索したところ、

gdbで接続して、dup2で標準出力・標準エラーをファイルに繋ぐなんて荒業を紹介している人がいた。

dup2なんてCプログラマじゃなきゃ使おうとも思わんな。

流れとしては、

 

  • 特定のコマンドをdisownする。前の記事参照。
  • プロセスIDを調べる
  • 標準出力、標準エラーのファイルを用意する
  • gdb -p で接続する
  • dup2でファイルに接続する。
  • デタッチ
  • gdbを抜ける

 

うーん。絶対忘れる。

 

以下、サンプル。実際はcpとかでやると思うが今回は、標準出力と標準エラーが分かりやすいようにしている。

標準出力にはdateの結果、標準エラーにはerrorを5秒間隔で。

うーん。非常にメンドイ。なるべくnohupを使いましょう。それか日常的にscreenを使いましょうってことですね。

ただ、考え方は非常に面白いので、覚えておくのはいいと思う。

実行中のコマンドをバックグラウンドにしてログアウトしても消えないように(disown)

軽い気持ちで実行したコマンドが、なかなか終わらなくて、あー。もー。帰りたいのに終わるまで帰れない。

なんて経験があったりする。ただこの disown ってコマンドを覚えておけば、そんなことを気にしないで実行したまま家に帰ることが出来る。

たぶんbash限定かもしれないけど、自分bashしか使わないので。。。

具体的には、

Ctrl-z でプロセスを一旦止めて、

bg でバックグラウンドプロセスにして。

って感じ。

ただこのままログアウトしても大丈夫なプロセスもあったりするのだが、止まるやつは止まる。

そこで、 disown %1 を実行してあげる。(%1はjob id jobsコマンドで確認出来る)

これでログアウトしても止まらないはずなので、安心して帰れる。

 

以下サンプル(cpの大量コピーとかがよくあるかと)

こんな感じ。標準出力するプログラムだと、入力が大変だが、めげずに実行する。

ログアウトすると、標準出力、標準エラーは保存できないので、そこは諦めるか別の方法

最初から、時間がかかるのがわかっているなら、 nohup を使ったほうが良い。標準出力もファイルに保存されるので。

nohupの記事も過去にちょろっと書いた。

 

標準入力からdiff

diffでファイルの比較とかやってると、実行するコマンドの結果(標準出力)を元に比較出来ないのかなと悩むことがある。

一度ファイルに落としてからdiffすればいいので、特に調べてなかったが、ちょいと調べたらあっさり見つかった。

コマンドの標準出力を比較する場合。

 

 

うわ。めっちゃ簡単。bashだけらしいけど、bash以外使った事ないから充分。

<(の間にはスペースは入れてはだめ。

 

コマンドの標準出力とファイルを比較する場合。

diffに限らず

こいつは、いろんなところで使えそう。

無知は罪ですな。

 

 

routeコマンドかipコマンドで経路ごとのMTUとかMSSとか

極極々まれに、特定のホストと通信できなくて、MTUを調整すると通信できたりすることがある。

MTUは通常回線終端のルーターで設定しておけば、特に問題になることはないのだが、たまーーーーに変なホストがいる。

そのたまーーーーーにいる変なホストのためだけにルーターをイジるのは、馬鹿げているし、Linuxマシンもサーバだったりすると

全体に影響するような設定は嫌なので特定のルーティングに対してだけ設定を行う。

んでこんな設定

route コマンドだとMTUじゃなくMSSの設定になる。

って、route はもはや古いコマンドだと書いたので、

 

 

iproute2では

iproute2 だとMTUの設定になる。

なんでこんなことが必要か?とか、MTUとMSSの違いって何?とか思ったら、MTU, MSS, Path MTU Discoveryとかでgoogle先生に聞けば教えてくれると思う。

これ系のトラブルは、ハマると泣きそうになる。

portフォワードというかTCPリレーというか(socat)

sshのポート転送をこよなく愛しているのだが、ログインするまでもなくポート転送したい時がある。

単純に、Aサーバのこのポートを、Bサーバのあのポートに接続するって場合。

socatってコマンドがあれば、なんとか出来る。

自分の:8443ポートを、foo.example.com:443に繋ぐ。

forkを付けないと、1回の接続でコマンドが終了してしまう。

これで、自分の8443に接続が来ると、foo.example.com:443に接続されるっていうすぐれもの。

ただ、このsocatって一番困るのが、たぶん大体の環境で入ってない。

netcatのncコマンドなら、たぶん何処の環境でも入ってるので、力技でやると、

以下のような感じ。ただ、fifoを事前に作って上げる必要があります。

標準入出力をfifoで繋いであげる感じ。

この考えはとても素晴らしいのだが、仕様なのかなんなのか、そこそこの頻度でコマンドが終了する。

もー。ようわからんので、whileで回してやる。

かなり強引。動作テスト程度には使えるが、本気運用は無理ですね。

ubuntuでUSB HDDケース(CSDRU3B6G)

別にubuntuに限った話では無いのだが、USB HDDケースを買った。

最近のLinuxなら、USB-HDDは特に意識することなく認識するので、

そんな悩む必要も無いのだが、無駄に悩みまくって、最終的にこいつを買った。

同じセンチュリーの裸族のお立ち台シリーズにしようかと思ったのだが、

スライドして差し込めるタイプのこいつの方が、使い勝手がよさそうなのでこいつにした。

以下、良い点。

  • 安い。多分お立ち台より安いし、他のUSB3.0対応でもここまで安いのなかなか無いのでは。
  • USB 3.0対応(当面自分の環境では使わないが)
  • ちゃんと本体に電源スイッチがある(普通のことかもしれないが)
  • スライドして取り外すのが簡単
  • 3TBytes超えのディスクも認識
  • 同じやつを買えば、重ね置きも可能

金額的にも、機能的にも大満足。別に不満では無いが気になるところを強いて言うと

  • 安っぽい(ホント安いプラスチック)
  • アクセスLEDが青い(部屋が真っ暗だと気になるかも。まー隠せばいいだけ)

ちなみに一緒に買ったHDD。

なんか最近Western Digitalばっかりだな。もちろん簡単に認識した。

ただ、今回3TのHDDを初めて買ったのだが、昔から持っていた、SATA-USB変換ケーブルだと、認識してくれない。

今回買ったHDDケースもう一個買ってもいいかな。

pythonで標準出力のバッファを制御する

logresolveコマンドのpython版を作った時に知ったので、メモを残す。

 

内容は表題のとおり。

 

以下2パターンがある模様。

 

  1. 起動時のオプション(-u, unbuffered)を指定する。

  2. sysモジュールからハンドラにアクセスし、都度flushする。

すぐ忘れそう。。。

apacheのログを後からホスト名変換(python編)

前に、同じ記事を書いたが、なんかubuntuをアップグレードした影響なのか、ちょっと挙動が変わった。

前は、標準入力に渡してあげると、順次変換が実行されていたのだが、今は、まとめて結果が表示される。

多少遅くても、実行時眺めていたかったので、それならpythonで作ればいいやんと思ってとてつもなくと汚く書いた。汚い!!!

ファイル名を渡すか、標準入力で渡すかのみです。

オリジナルも同じだが、逆引き出来ない時の、タイムアウト時間がちょっと長くて
こっちでは短くしたかったのだが、結局面倒で(実力が無くて)やめた。

ubuntu 14.04でffmpegの名前が変わった(avconvになった)

ふと、ffmpegを使おうと思ったら、

あれ、コマンドが無いって言われている。バージョンアップ前にバリバリ使ってた覚えがあるので絶対入っていたはず。

 

そういえば、ffmpeg時代に、コマンド実行時に、「なんか名前変わるよ」的な警告が出ていた気がする。

うーん。新しい名前が思い出せない。

ちょいと調べたところ、

avconv

になったそうです。今のところオプションとかの違いはなさそう。というかそんなにffmpegを使わないのでわからない。

ちなみにubuntuでのパッケージは、

libav-tools

うーん。ますます忘れそう。

ubuntu 14.04 を無線LANアクセスポイントにする

表題のままなのだが、ubuntu 14.04 を無線LANアクセスポイントにしてみた。

無線LANルータが格安で販売されている今日このごろに、なんでこんなことやってるんだろというツッコミは後にして、前提条件など。

  • OSはubuntu 14.04 でデスクトップ版です。
  • 無線LANは、過去にamazonで買った格安のこいつ(WLI-UC-GNM)
    激安だけど、802.11nまで対応していたはず。期待はしないけど。
  • モードはブリッジモード。LANと別セグメントにしたくないから。
  • ノートPC1台つながれば良いので、MACアドレス制限とか、ステルスSSIDとかでやってみる。

設定などなど

NetworkManagerを止める

後の方に気付いたけど、最初に止めた方が無難。

Desktop PCで、固定IP運用なので、そもそもこいつは必要ない。なので、NetworkManagerを止めて、手動での設定に移行する。

まず動いているか確認

いたら止める。

自動起動を止める。

今は、こんな方法なんですね。

必要パッケージをインストールする

ブリッジのやつと、アクセスポイントのやつ

Network設定を手動に移行する

自分の場合は、既に手動になってた(NetworkManagerは起動してたけど)が念の為確認。

こんな感じの設定、ブリッジ設定もやってます。ミスるとネットワーク繋がらなくなるので要注意。設定終わったら再起動しといた方が無難。

無線LAN(wlan0とか)のブリッジは、hostapdがよろしくやってくれるのでここでは設定しない。

無線LAN(WLI-UC-GNM)を挿す

別にいつでもいいけど。iwconfigでwlan0(無線LANが1つの場合)が見えてればたぶんOK。

ドライバーとかもよろしくやってくれるはず。

ドライバっぽいやつら

hostapdの設定

やっと本番。

自分はこんな感じの設定にした。

MACアドレス許可リストファイルを作っておく。  

  パーミッションもきつめにする。

  自動起動の設定 /etc/default/hostapdのファイルに、DAEMON_CONFを定義

  デーモン起動

  正しく起動すれば、きっと使えるはず。