netcatや他のコマンドを使ってUnixポートをロックする方法はありますか?
私はこのようなことをしたい:
set -e;
nc -lock 8000 & # this needs to fail if another process holds the lock
wait;
my-proc # start my process
どうすればいいですか?
答え1
抽象Unixソケット(man 7 unix
):
- 要約:抽象ソケットアドレス(およびパス名ソケット)の違いは、sun_path [0]がNULLバイト( '\ 0')であることです。この名前空間のソケットアドレスは、sun_pathの追加バイトによって提供され、アドレス構造の指定された長さに置き換えられます。 (名前のヌルバイトには特別な意味はありません。) 名前はファイルシステムパス名とは関係ありません。 [...]
主な関心事は、ソケットを作成したプロセスが終了してもソケットが持続しないことです。幸いなことに、ソケットを具体的に抽象化する方法がsocat
あります(引数とシェルを処理するABSTRACT-LISTEN
必要はありません)。'\0'
したがって、実装を許可するこのPythonメソッドシェルから:
#!/bin/sh
socat ABSTRACT-LISTEN:/myownapplock - >/dev/null &
socatpid=$!
sleep 2 # wait for socat to have executed and be listening or have failed
if pgrep -P $$ '^socat$'; then
locked=yes
else
locked=no
echo >&2 'Lock failed.'
exit 1
fi
my-proc
kill $socatpid # cleanup once my-proc is done
同じコードを2番目に実行すると失敗します。改善ができると確信していますsleep 2
が、このコードはまだ競合していません(socatが2秒以内に始まる限り)。たとえば、抽象ソケットはnetstat -xlp|fgrep @/myownapplock
。