Unixソケット/ポートを使用したロックの作成

Unixソケット/ポートを使用したロックの作成

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

関連情報