Долгое время самым популярным методом было использовать supervisor.
Однако с переходом Linux дистрибутивов на systemd сделать это можно не менее просто штатными средствами. Естественно рассматривать все параметры работы с systemd в данном топике мы не станем (информации полно в сети) - но как пример рассмотрим простейший вариант когда нужно запускать скрипт, создавать PID файл и так далее:
создаем файлик appname.service
[Unit] Description=Appname API # стартовать после запуска следующих сервисов After=network.target redis.service postgresql-9.4.service # Требуемые сервисы Requires=postgresql-9.4.service redis.service # Необходимые сервисы Wants=redis.service postgresql-9.4.service [Service] # Тип запуска Type=simple # Перезапуск при сбое Restart=always # расположение PID файла PIDFile=/var/run/appname/appname.pid # Рабочий каталог WorkingDirectory=/home/username/appname # Пользователь и группа из под которых запускать User=app_user Group=app_user_group # Данный параметр необходим что бы дать права на выполнение следующих PermissionsStartOnly=true # ExecStartPre - выполнить ДО старта приложения ExecStartPre=-/usr/bin/mkdir -p /var/run/appname ExecStartPre=/usr/bin/chown -R app_user:app_user_group /var/run/appname # Запуск приложения ExecStart=/usr/bin/python3.4 appname.py & # Пауза при необходимости TimeoutSec=300 [Install] WantedBy=multi-user.target
Сохраняем его в /etc/systemd/system
А дальше уже работаем штатным инструментом
systemctl start appname, systemctl status appname ….
Вот пожалуй и все.