Я использую команду nohup
с Python и Flask для фонового процесса. После того, как я закрываю терминал, он работает нормально, но через 1 или 2 дня процесс останавливается. Может кто-нибудь сказать мне, как сохранить фоновый процесс? Я использую команду ниже:
screen
space
nohup python -m flask run --cert local.crt --key local.key --host=0.0.0.0 --port=443 &
ctrl+a+d
Вероятно, для этой цели вам следует использовать демон свойств, например gunicorn.
@KenKinder, пожалуйста, не могли бы вы подробно объяснить, как использовать демона, такого как пушка?
Я бы порекомендовал использовать что-то вроде службы systemctl
для таких целей, которые обеспечивают дополнительную поддержку автоматического перезапуска вашей службы в случае ее сбоя или сбоя и обеспечения ее работы.
nohup
не запускает процесс в фоновом режиме. Это просто заставляет его игнорировать сигнал HUP
.
Попробуйте nohup python -m flask run --cert local.crt --key local.key --host=0.0.0.0 --port=443 >/dev/null 2>&1&
Используйте nohup
, вы должны перенаправить печать на /dev/null
или log
, иначе будет создан файл nohup.out
, занимающий место на диске.
В большинстве случаев мы используем gunicorn
и supervisor
для управления приложением flask.
Можете ли вы сказать мне, как использовать гуникорн в колбе?
pip install gunicorn
тогда беги gunicorn -d -b 0.0.0.0:443 --certfile=local.crt --keyfile=local.key [app_file:app_name]
Предположим, что весь ваш код Flask находится в папке /home/abc_user/flask_app
.
Создайте файл flask-server.service
в /etc/systemd/system
.
[Unit]
Description=Flask server
After=network.target
[Service]
User=abc_user
Group=abc_user
WorkingDirectory=/home/abc_user/flask_app
ExecStart=python -m flask run --cert local.crt --key local.key --host=0.0.0.0 --port=443
Restart=always
[Install]
WantedBy=multi-user.target
Беги sudo systemctl daemon-reload
.
Запустите сервис с помощью systemctl start flask-server.service
.
Убедитесь, что он начался systemctl status flask-server.service
. В статусе должно быть написано "работает".
Если вы хотите, чтобы ваш фляжный сервер автоматически запускался после перезагрузки, запустите systemctl enable flask-server.service
systemctl status flask-server.service
systemctl start flask-server.service
systemctl stop flask-server.service
journalctl -u flask-server.service
journalctl -f -u flask-server.service
journalctl -u flask-server.service --since "1 hour ago"
Спасибо. Я получаю сообщение об ошибке /etc/systemd/system/flask-server.service:9: Исполняемый файл "python" не найден в пути "/usr/local/sbin:/usr/local/" при запуске - systemctl status flask-server.service
Замените python
выводом which python
Предыдущая ошибка была устранена. Теперь я получаю сообщение об ошибке Loaded: loaded (/etc/systemd/system/flask-server.service; disabled; vendor preset: enabled) Active: failed (Result: exit-code) since Tue 2021-01-05 17:37:19 UTC; 5s ago Process: 1418725 ExecStart=/usr/bin/which python -m flask run --cert local.crt --key local.key --host=0.0.0.0 --port=443 (code=exited, status=217/USER) Main PID: 1418725 (code=exited, status=217/USER)
Там написано (code=exited, status=217/USER)
, что означает, что пользователя не существует или вы могли допустить ошибки при его добавлении. Смотрите это
Теперь я получаю ошибку Loaded: loaded (/etc/systemd/system/flask-server.service; disabled; vendor preset: enabled) Active: failed (Result: exit-code) since Tue 2021-01-05 19:05:37 UTC; 5s ago Process: 1419532 ExecStart=/usr/bin/which python -m flask run --cert local.crt --key local.key --host=0.0.0.0 --port=443 (code=exited, status=1/FAILURE) Main PID: 1419532 (code=exited, status=1/FAILURE)
Пожалуйста, проверьте журналы с помощью команды journalctl
, упомянутой в вопросе, и поделитесь ими. Одна проблема, которую я вижу, заключается в том, что вы написали путь python как /usr/bin/which python
вместо вывода which python
, который возвращает /usr/bin/python
в моей системе. Поэтому я бы заменил /usr/bin/which python
на /usr/bin/python
Давайте продолжим обсуждение в чате.
Возможно, вы выключили компьютер, на котором работает фляжный сервер? Если это так, проблема будет решена, либо не выключая компьютер, либо снова запуская фляжный сервер после выключения!
nohup — это команда POSIX для игнорирования сигнала HUP (зависания). Сигнал HUP, по соглашению, является способом, которым терминал предупреждает зависимые процессы о выходе из системы.
Вывод, который обычно поступает на терминал, поступает в файл с именем nohup.out, если он еще не был перенаправлен.
См. nohup.out для поиска ошибок в ./ или исполняемом каталоге. Это не ошибка nohup. Посмотрите nohup.out и ошибку Google и обновите вопрос.
Я предлагаю вам запустить Flask в течение двух дней без nohup, чтобы увидеть, не вызывает ли это какую-либо ошибку.