Cria bloqueio usando socket / port unix

1

Existe uma maneira de manter um bloqueio em uma porta unix usando o netcat ou algum outro comando?

Eu quero fazer algo assim:

set -e;
nc -lock 8000 &  # this needs to fail if another process holds the lock
wait;
my-proc  # start my process

como posso fazer isso?

    
por Alexander Mills 28.02.2018 / 06:54

1 resposta

1

Resumo do soquete unix ( man 7 unix ):

  • abstract: an abstract socket address is distinguished (from a pathname socket) by the fact that sun_path[0] is a null byte ('%bl0ck_qu0te%'). The socket's address in this namespace is given by the additional bytes in sun_path that are covered by the specified length of the address structure. (Null bytes in the name have no special significance.) The name has no connection with filesystem pathnames. [...]

Seu principal interesse aqui é que este socket não fica por perto quando o processo que o criou morre. Felizmente socat fornece um método ABSTRACT-LISTEN especificamente para soquetes abstratos (evitando ter que lidar com 'sleep 2' em parâmetros e shell). Permitindo assim implementar este método python no shell:

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

Executando o mesmo código uma segunda vez falhará. Tenho certeza que o netstat -xlp|fgrep @/myownapplock pode ser melhorado, mas esse código ainda é livre de corrida (contanto que o socat leve menos de 2 segundos para iniciar). O soquete abstrato pode ser visto, por exemplo, com %code% .

    
por 28.02.2018 / 08:14