Esse invólucro shell se parece com um script de inicialização, mas aparentemente não é (portanto, você precisa usar sudo lá; os scripts executados pelo init não exigiriam isso).
Essa parece ser uma maneira muito desajeitada de fazer isso; o invólucro do shell não serve a nenhum propósito que não poderia ser melhor servido pelo próprio programa python. Livre-se disso; Se você quiser um script init especificamente, escreva um mínimo, mas sugiro que você mova a lógica de controlar o daemon do script init para o daemon ( UPSalarm.py ).
Como você deseja apenas uma instância, defina um arquivo pid que o processo deve usar. Quando UPSalarm.py start for executado, ele verificará a existência desse arquivo. Se não existir, ele grava seu próprio pid nesse arquivo e continua. Se existir, obtém o pid e depois verifica com o SO para ver se existe um processo com o pid e, em caso afirmativo, como é chamado. Isso provará que UPSalarm.py já está em execução ou não. Se estiver, saia com uma mensagem "Já está em execução".
Quando UPSalarm.py stop é executado, uma sequência semelhante está envolvida - verifique o arquivo pid, se ele existir, verifique o pid, se o pid é válido para um processo chamado UPSalarm.py , sinalize para parar, presumivelmente com %código%. SIGINT deve implementar um manipulador de sinal para UPSalarm.py , de modo que exclua o arquivo pid antes que ele saia.
Eu não sou um programador python e este não é um site de programação (para isso, veja Stack Overflow ), mas eu prometo que tudo isso é facilmente possível com python.
- Para obter o pid do processo atual, use
SIGINT. - Para mapear um pid a um nome de processo, leia
os.getpid()e faça uma pesquisa por/proc/[pid]/cmdline(ou melhor ainda, o nome do processo como invocado, que seriaUPSalarm.py, consulte here ). - Para o tratamento de sinal, inicie aqui e aqui .
- Para enviar um sinal para outro processo, use
sys.argv[0].
Deve ser fácil configurar os.kill() para lidar com esse daemon. Você também tem a opção de usar apenas monit (ou seu próprio script) para chamar cron em intervalos, digamos, a cada 5-10 minutos.