Esta questão pode ser a melhor opção para o serverfault visto que é essencialmente sobre trabalhos típicos de sysadmin como o gerenciamento de processos, ao invés de qualquer coisa específica do Ubuntu, mas de qualquer maneira uma resposta:
O que você está essencialmente falando é um processo daemon - que é um processo iniciado e monitorado pelo sistema operacional e reiniciado em caso de falha.
Você pode usar um script init
do sistema para isso, mas pode haver muitos problemas sutis de gerenciamento com scripts de inicialização, e já existe uma solução melhor e mais fácil. Eu recomendaria altamente supervisord
A partir dessa página:
[...] It shares some of the same goals of programs like launchd, daemontools, and runit. Unlike some of these programs, it is not meant to be run as a substitute for init as “process id 1”. Instead it is meant to be used to control processes related to a project or a customer, and is meant to start like any other program at boot time.
No Ubuntu, você pode instalar o supervisord com sudo apt-get install supervisor
.
Em seguida, crie um novo arquivo de configuração no diretório de configuração do supervisor (no Ubuntu, isso é /etc/supervisor/conf.d
) e nomeie-o como pelican_watcher.conf
(a extensão .conf
é importante)
[program:pelican_watcher]
directory=/directory/of/command
command=watch_regenerate.py
user=timbram
autostart=true
autorestart=true
Em seguida, você pode criar um programa que simplesmente observe as alterações e execute make regenerate
quando um arquivo for alterado (certifique-se de adicionar seus próprios valores reais para user
, command
e directory
acima ).
Este script python usa o pacote watchdog
para notificá-lo de alterações em um diretório e executar algum comando quando os arquivos forem alterados.
#!/usr/bin/env python2
import sys
import subprocess
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
PELICAN_DIR = "/path/to/your/pelican/site"
class PelicanWatcher(FileSystemEventHandler):
def on_modified(self, event):
try:
subprocess.check_call(['make', 'regenerate'])
except subprocess.CalledProcessError:
# You may want better logging here, such as sending mail or similar
sys.stderr.write("an error occurred!")
if __name__ == '__main__':
observer = Observer()
event_handler = PelicanWatcher()
observer.schedule(event_handler, PELICAN_DIR, recursive=True)
observer.start()
# Now sleep forever while watchdog does it's business
while True:
time.sleep(60)
Para instalar o watchdog, sudo apt-get install python-watchdog
, certifique-se de editar os caminhos falsos que eu coloquei em ( PELICAN_DIR
)
Em seguida, coloque este script python onde quer que você tenha especificado no arquivo de configuração do supervisor ( watch_regenerate.py
), torne-o executável e sudo supervisorctl reread && sudo supervisorctl update
. A partir daí, o supervisord reiniciará esse script se ele terminar inesperadamente e iniciará o processo na inicialização.
supervisor também possui um comando interativo no qual você pode inspecionar os processos em execução: sudo supervisorctl
sem argumentos
readthedocs: link