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 '
em parâmetros e shell). Permitindo assim implementar este método python no shell: sleep 2
'
#!/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% .