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.