Unix - ps para verificar se o script está sendo executado

0

Estou executando um script que serve para processar alguns utilitários para recuperar alguns dados. Este script está situado em um diretório onde os usuários podem colocar seus arquivos que precisam ser recuperados. Como muitos usuários podem ter acesso a esse diretório e executar o script, quero ter uma condição que verifique se o script já está em execução. Se sim, faça eco da mensagem "tente novamente mais tarde"; caso contrário, corra como de costume.

Eu fiz algumas pesquisas aqui e percebi que isso é um código funcional para minha funcionalidade, conforme descrito acima.

#!/bin/bash 
me="$(basename "$0")";
running=$(ps h -C "$me" | grep -wv $$ | wc -l);
[[ $running > 1 ]] && exit;

Eu gostaria de implementar essa funcionalidade e o código acima em um Solaris SunOS 5.8. Eu entendo que o ps funciona de maneira diferente no Unix e no Linux.

    
por ratcat 08.05.2018 / 11:05

1 resposta

0

O comando ps que você está usando não está relacionado ao UNIX.

O uso de key letters em vez de options foi usado no BSD ps , mas isso nunca chegou ao padrão. O BSD até usa a letra da chave h de uma maneira diferente, como você poderia esperar.

Eu recomendo usar:

ps -p $$

Se você quiser verificar se há mais instâncias desse script, use:

myname='basename $0'
pids='pgrep -d, $myname'
ps -p $pids

Em teoria, você não precisa mais executar ps , seria suficiente verificar a saída de pgrep para uma vírgula.

Se você gosta de implementar um algoritmo de arquivo de bloqueio e ter um shell compatível com POSIX, você pode usar:

set -o noclobber
:> /var/tmp/myscript
if [ $? -ne 0 ]; then
     echo already running
     exit 1
fi
... do some stuff
rm /var/tmp/myscript

Se isso funciona de forma confiável depende se o shell implementa noclobber da maneira que o POSIX gosta de vê-lo. Algumas shells podem não implementar isso atomicamente, então você precisa saber se a sua shell está OK.

    
por 08.05.2018 / 11:36