Comando / ferramenta para evitar a execução de um aplicativo mais de uma vez

4

Eu estou querendo saber se existe alguma ferramenta / aplicativo que pode impedir que outra ferramenta / aplicativo seja executado mais de uma vez. Eu sei que isso pode ser feito manualmente usando o pidfile, mas não há alguma ferramenta para isso?

Como: / bin / ruonce / bin / myApp

Ele retornará 0 quando o aplicativo for gerado pela primeira vez em segundo plano, 1 quando já estiver em execução.

No OpenRC há um daemon start-stop que é próximo, mas é desnecessariamente complexo e não autônomo.

    
por k3a 01.12.2013 / 13:09

3 respostas

8

Existe um utilitário simples chamado flock que envolve um processo em um arquivo de trava e, por padrão, cria um bloqueio exclusivo. Isso significa que as execuções subsequentes do processo agrupadas pelo arquivo do lote falharão se a chamada anterior ainda estiver em execução.

Você também pode dizer ao flock para falhar imediatamente em vez de aguardar o bloqueio:

flock -xn /bin/yourcmd

Este binário é uma parte do pacote util-linux , que deve estar disponível por padrão na sua distribuição escolhida.

    
por 01.12.2013 / 19:46
3

Você pode fazer isso com uma rotina lockfile (geralmente um diretório) em seu script ... PID é o caminho certo para lidar com isso, mas o arquivo de bloqueio pode ser uma maneira rápida de alcançar o que você deseja. Veja também esta solução StackOverflow .

Um exemplo com explicação de um script Perl que eu uso com frequência. Só pode ter uma instância em execução de cada vez:

# Set two variables that are used by the code that ensures that only
# one Orca process is using a particular configuration file at a
# particular time.  This is done by using the fact that mkdir() is
# atomic.  The first variable is the name of the directory to create
# and the second is a flag used by the Orca clean up code to see if
# the locking directory should be removed.
my $locking_directory       = "$config_filename.lock";
my $rmdir_locking_directory = '';

# Install signal handlers to clean Orca up, including the locking
# directory.
$SIG{INT}     = \&catch_signal;
$SIG{PIPE}    = \&catch_signal;
$SIG{TERM}    = \&catch_signal;
$SIG{__DIE__} = \&catch_die;

# Now try to create the locking directory.
unless (mkdir($locking_directory, 0755)) {
  die "$0: cannot create locking directory '$locking_directory': $!\n";
}
$rmdir_locking_directory = 1;
    
por 01.12.2013 / 13:56
2

Nada mais vem à mente.

No entanto, o que você está querendo é um script que você poderia escrever facilmente. Os requisitos seriam (não em ordem programática):

  • Inicie o processo e armazene o PID de alguma forma que identifique exclusivamente o programa em execução
  • Verifique se, se houver um arquivo PID, o PID nele corresponde a uma instância existente desse programa; se isso acontecer, aborte; se isso não acontecer, inicie o processo normalmente e substitua o arquivo PID
  • Retornar seu status

Isso é muito da funcionalidade de start-stop-daemon, então leva alguém a se perguntar por que você simplesmente não ignora a funcionalidade daquilo que você não precisa, e a usa. Você pode até criar um script ou um alias para envolvê-lo, de modo que você possa digitar uma pequena quantidade de caracteres.

Por questão de interesse, você também pode fazer isso sem arquivos PID e capturar todos os processos em execução com um nome de arquivo específico (não nome do caminho), seja iniciado "corretamente" ou não, usando pidof em seu script.

    
por 01.12.2013 / 13:37

Tags