Verifique e teste o bloqueio de outro processo

3

Estou tentando criar um wrapper de serviço ( init.d script) em torno de um dos meus aplicativos favoritos. O aplicativo cria um um PID e um arquivo de bloqueio , e estou tentando usá-los para garantir que eu pode relatar o status preciso do aplicativo e impedir que meu serviço inicie várias cópias.

Infelizmente, o aplicativo (ou sistema) trava de tempos em tempos, deixando o PID e os arquivos de bloqueio para trás, então não posso apenas verificar a existência desses arquivos para determinar se o meu aplicativo está sendo executado ou não.

O aplicativo cria um bloqueio no arquivo de bloqueio, um POSIX WRITE lock, de acordo com lslocks , mas parece que, se eu tentar criar um bloqueio com flock -x -n "$file" echo dummy , o comando é bem-sucedido, minha surpresa. Excluir o arquivo também foi bem-sucedido ( rm "$file" ), bem como gravar nele, o que, em um sistema BTRFS, faz muito pouco sentido, embora não o torne menos agravante.

Então, como posso consultar o arquivo de forma que eu saiba se o arquivo tem um bloqueio ( POSIX ou FLOCK ) ou não?

    
por palswim 16.01.2017 / 00:46

1 resposta

0

Eu usei a seguinte função no meu script para fazer isso:

getPIDLock () {
    if [ ! -e "$LockFile" ]; then
        return 0 # Not an error, but lsof will emit a lot of text if the file doesn't exist
    fi
    local PIDLock=$( lsof -F p "$1" | head -n 1 )
    local strEcho='echo ${PID:1}'
    bash -c "PID=\"$PIDLock\";$strEcho;" # Assuming system has BASH, but not assuming that the default shell is BASH
    return 0
}

Isso emitirá um PID se o arquivo em questão tiver um bloqueio nele; caso contrário, ele emitirá uma string em branco.

PID=$( getPIDLock "/path/to/pidfile" )
if [ -n $PID ]; then
    # Do your thing
fi
    
por 16.02.2017 / 23:07