使用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] 是空字节('\0')。此命名空间中套接字的地址由 sun_path 中的附加字节给出,这些字节由地址结构的指定长度覆盖。 (名称中的空字节没有特殊意义。)该名称与文件系统路径名没有联系。 [...]

它的主要兴趣在于,当创建它的进程终止时,该套接字不会保留下来。幸运的是,socat提供了一种ABSTRACT-LISTEN专门用于抽象套接字的方法(避免必须'\0'在参数和 shell 中进行处理)。从而允许实施这个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

第二次运行相同的代码将会失败。我确信sleep 2可以改进,但这段代码仍然是无竞争的(只要 socat 启动时间少于 2 秒)。例如,可以使用 来查看抽象套接字netstat -xlp|fgrep @/myownapplock

相关内容