2014年5月16日金曜日

nohupはどこにあるのか?

tcsh の場合 where を使ってみると、こうなります。(Debian Linuxで試しています。)
% where nohup
nohup is a shell built-in
/usr/bin/nohup
/usr/bin/X11/nohup
一方 bash の場合は where が無いので which -a を使ってみる。
$ which -a nohup
/usr/bin/nohup
/usr/bin/X11/nohup

というわけで、tcshのnohupはシェルビルトインコマンドであり、bashのそれは外部コマンドなのです。
そして挙動ですが、tcshの場合、manpageによると
デフォルトでは、シェルの子供たちもそうしますが、 シェルは終了時に HUP を子供たちに送りません。 hup はシェルが終了時に 子供に HUP を送るようにし、 nohup は子供がHUP を無視するように 設定します。
とのこと。一方bashの場合はshoptで確かめます。
$ shopt huponexit
huponexit       off
あれ? いずれにせよ、バックグラウンドジョブにhupが渡らないように見えます、 nohup無くても困らないんじゃない? などと思ってしまうのですが、実はそんな簡単な話でもないようです。

 技術 / UNIX / なぜnohupをバックグランドジョブとして起動するのが定番なのか?(擬似端末, Pseudo Terminal, SIGHUP他) http://www.glamenv-septzen.net/view/854

詳細についてはこちらの記事をお勧めします。勉強になります。

2013年10月19日土曜日

hosts.allow に気をつけよう

/etc/hosts.allow

ALL : localhost 127.0.0.1 : allow

を書いておかないと nis クライアントが正しく動作しなかったりするので気をつけましょう、という話。

自分が設定した後に管理を他人に任せていたLinux機 ( debian ) がありました。管理者がいなくなって放置されていたため、回収してOSを更新していたのですが、何故かNISサーバに接続出来ないのです。

# /etc/init.d/nis restart
[....] Stopping NIS services: ypbindstart-stop-daemon: warning: failed to kill 4164: No such process
[ ok rv ypppasswdd ypxfrd.
[....] Starting NIS services: ypbind[....] binding to YP server.................[FAIL.....................failed (backgrounded).
. ok
ypbind で何かが起こっているらしく、起動しない、じゃなくて、NISサーバに接続出来ない。ypbind をデバッグモードで起動してみます。

# ypbind -debug
4447: parsing config file
4447: Trying entry: ypserver 192.168.1.111
4447: parsed ypserver 192.168.1.111
4447: add_server() domain: lo_nis_domain, host: 192.168.1.111, slot: 0
4447: [Welcome to ypbind-mt, version 1.20.1]

4447: ping interval is 20 seconds

4449: NetworkManager is running.

4449: Are offline
4449: interface: org.freedesktop.DBus, object path: /org/freedesktop/DBus, method: NameAcquired
サービスを登録できません: RPC: 認証エラーです; why = クライアントの信任が弱すぎます
4447: Unable to register (YPBINDPROG, YPBINDVERS, udp).

何故だー? と思ってエラーメッセージを元に検索してみたら…
tcpwrapperを設定しているのが原因。
きりんメモ@GIFU( http://giraffeforestg.blog.fc2.com/blog-entry-44.html )

あれ?と思って /etc/hosts.allow を見ると

ALL: 192.168.1. :allow
ALL: deny

確かにlocalhostの記述がない…セグメント丸ごとALLにして満足していたのか、昔の自分。
ALL: localhost 127.0.0.1 : allow
ALL: 192.168.1. :allow
ALL: deny

と修正して nis を再起動してみると、

# service nis restart
[....] Stopping NIS services: ypbindstart-stop-daemon: warning: failed to kill 4447: No such process
[ ok rv ypppasswdd ypxfrd.
[ ok ] Starting NIS services: ypbind.

あっさり解決。(IPv6の人は[::1]も書いた方がいいのかも?)

/etc/hosts.allow は portmap, rpcbindが参照しているので nis や nfs といったrpc絡みのサービスに影響するのに、油断していたなあ、という話でした。