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

추상 유닉스 소켓(man 7 unix):

  • 개요: 추상 소켓 주소(및 경로명 소켓)의 차이점은 sun_path[0]가 널 바이트('\0')라는 것입니다. 이 네임스페이스의 소켓 주소는 sun_path의 추가 바이트에 의해 제공되며, 이는 주소 구조의 지정된 길이로 대체됩니다. (이름의 널 바이트는 특별한 의미가 없습니다.) 이름은 파일 시스템 경로 이름과 관련이 없습니다. [...]

주요 관심사는 소켓을 생성한 프로세스가 종료될 때 소켓이 지속되지 않는다는 것입니다. 다행스럽게도 소켓을 구체적으로 추상화하는 방법이 socat있습니다 ( 인수와 셸을 처리 ABSTRACT-LISTEN할 필요가 없음 ). '\0'따라서 구현을 허용이 파이썬 방법셸에서:

#!/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

동일한 코드를 두 번째로 실행하면 실패합니다. 개선이 이루어질 수 있다고 확신 sleep 2하지만 이 코드는 여전히 경합이 없습니다(socat이 2초 이내에 시작되는 한). 예를 들어 추상 소켓은 netstat -xlp|fgrep @/myownapplock.

관련 정보