Evitar que uma segunda instância do meu software seja iniciada

2

Eu escrevi um script de serviço para executar um software específico no momento da inicialização. Como posso restringir este software para que ele não seja executado manualmente novamente?

Quero dizer, o software tem que ter apenas uma instância na memória.

Eu não quero alterar o código-fonte do meu software, quero o init para este trabalho para mim.

    
por Sepahrad Salour 18.08.2014 / 14:32

5 respostas

4

Isso deve funcionar para um script bash. Ele abortará a execução do script se outra instância do software externo for encontrada. A chave aqui é 'pidof.

#!/bin/bash

# Abort startup if another instance was found    
pidof /path/to/software.executable > /dev/null && {
  echo Sorry. Only one instance allowed.
  exit
}

Como alternativa, você pode usar arquivos de bloqueio, substituir a instância em execução (ou seja, primeiro eliminar a instância em execução e permitir a execução).

No entanto, um usuário experiente pode ignorar esse script e invocar o comando externo diretamente.

    
por 18.08.2014 / 14:45
1

Se formos limitados a executar apenas algo com init , a única solução em que posso pensar é ter um script de eliminação leve monitorando constantemente os processos em execução e encerrar quaisquer processos adicionais.

Mas eu sugeriria que isso está longe de ser perfeito, e poderia ser contornado com relativa facilidade.

    
por 18.08.2014 / 15:22
1

Na verdade, a maneira mais sensata é negar o acesso do usuário usando as permissões corretas e permitir que apenas usuários root (esque) executem o software.

    
por 18.08.2014 / 15:36
1

Você pode instruir o init para executar apenas uma instância do seu software - na verdade, isso acontecerá naturalmente se você iniciar seu software a partir do init. Mas o trabalho do init não tem nada a ver com impedir que outros programas iniciem outras instâncias do seu software.

Se você quiser garantir que apenas uma única instância do seu programa seja executada, em vez de executar o programa diretamente, execute um script de wrapper que verifique se o software já está em execução. A resposta do LatinSuD dá um exemplo de tal script wrapper.

É claro que um usuário pode ignorar o script wrapper e executar outra instância do seu software. Mas um usuário também pode criar um arquivo executável que seja idêntico ao seu e executá-lo. Então, passar por um script de wrapper implementa a restrição desejada de uma maneira que faz sentido.

Ter várias instâncias do mesmo executável em execução não é um problema. O que pode ser um problema é se eles acessam o mesmo recurso: arquivos, portas de rede, etc. Se você precisar proteger contra o acesso simultâneo ao mesmo recurso, os métodos possíveis dependerão de qual é o recurso. Se o recurso for uma porta TCP ou UDP, somente um processo poderá escutar nessa porta de qualquer maneira. Se o recurso for um arquivo, certifique-se de que apenas o usuário que está executando a instância iniciada por um script de inicialização tenha o direito de acessar esse arquivo.

    
por 19.08.2014 / 01:27
1

Tópico antigo, mas vale a pena colocar algumas anotações aqui: No caso de executar o processo em um pai como "/ bin / bash /tmp/my_script.sh" ou "python my_script.py", use o seguinte:

pgrep -l my_script.sh >/dev/null && echo "Another process is running" || { 
do your stuff;
}
    
por 13.12.2017 / 02:50