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
.