Как запустить приложение python на ubuntu?

У меня есть код на Python, мне нужно разместить его на виртуальной машине. На виртуалку я установил ubuntu, выглядит все так: Как запустить код python на этой виртуалке, и как перенести на виртуалку код, если это нужно. Перенести файл не получится обычным перетаскиванием, так как все из чего состоит виртуалка — это командная строка ubuntu.
Отслеживать
задан 16 авг 2021 в 4:40
Max Pyankov Max Pyankov
145 1 1 серебряный знак 10 10 бронзовых знаков
Можно подключиться к виртуалке по ssh (или просто sh) (например, с помощью putty), передать файл через командную строку.
16 авг 2021 в 4:52
Общая папка host/guest будет работать даже в командной строке.
16 авг 2021 в 5:24
И запуск скрипта в консоли убунты ничем не отличается от запуска в консоли винды.
16 авг 2021 в 5:39
Перенос файлов — sftp+FileZilla . Собственно если у тебя там есть ssh , то 99,9% у тебя уже есть sftp .
Запуск Python скрипта в виде службы через systemctl/systemd
Есть несколько способов запуска вашей программы в качестве фоновой службы в Linux, таких как crontab, .bashrc и т. д., но сегодня будет разговор о systemd. Изначально я искал способ запустить свой скрипт на Python в качестве фоновой службы, поэтому даже если сервер по какой-то причине перезагрузится, мой скрипт все равно должен работать в фоновом режиме, после небольшого ресерча и я обнаружил, что systemd позволяет мне это сделать. Давайте начнем.
Настройки далее будут производиться на машине с Ubuntu 20.04.
Почти все версии Linux поставляются с systemd из коробки, но если у вас его нет, вы можете просто запустить следующую команду:
sudo apt install -y systemd
Примечание. Флаг -y означает быструю установку пакетов и зависимостей.
Чтобы проверить, какая версия systemd у вас установлена, просто выполните команду:
systemd --version
Создайте файл python с любым именем. Я назову свой скрипт именем test.py.
sudo nano test.py
import time from datetime import datetime while True: with open("timestamp.txt", "a") as f: f.write("Текущая временная метка: " + str(datetime.now())) f.close() time.sleep(10)
Приведенный выше скрипт будет записывать текущую метку времени в файл каждые 10 секунд. Теперь напишем сервис.
sudo nano /etc/systemd/system/test.service
(имя службы, которая тестируется в этом случае)
[Unit] Description=My test service After=multi-user.target [Service] User=deepak Group=admin Type=simple Restart=always ExecStart=/usr/bin/python3 /home//test.py [Install] WantedBy=multi-user.target
Замените имя пользователя в вашей ОС, где написано . Флаг ExecStart принимает команду, которую вы хотите запустить. Таким образом, в основном первый аргумент — это путь к python (в моем случае это python3), а второй аргумент — это путь к скрипту, который необходимо выполнить. Флаг перезапуска всегда установлен, потому что я хочу перезапустить свою службу, если сервер будет перезапущен.
Здесь мы определили User=deepak и Group=admin, чтобы убедиться, что скрипт будет выполняться только от имени пользователя deepak, входящего в группу admin.
Теперь нам нужно перезагрузить демон.
sudo systemctl daemon-reload
Давайте включим наш сервис, чтобы он не отключался при перезагрузке сервера.
sudo systemctl enable test.service
А теперь давайте запустим наш сервис.
sudo systemctl start test.service
Теперь наш сервис работает.
Примечание. Файл будет записан в корневой каталог (/), потому что программа запишет путь с точки зрения systemd. Чтобы изменить это, просто отредактируйте путь к файлу. Например:
import time from datetime import datetime path_to_file = "введите желаемый путь к файлу" while True: with open(path_to_file, "a") as f: f.write("Текущая временная метка: " + str(datetime.now())) f.close() time.sleep(10)
Есть несколько команд, которые вы можете выполнить для запуска, остановки, перезапуска и проверки состояния.
Чтобы остановить службу.
sudo systemctl stop name_of_your_service
sudo systemctl restart name_of_your_service
Чтобы проверить статус.
sudo systemctl status name_of_your_service
Это было очень поверхностное знакомство с systemd, предназначенное для новичков, которые хотят начать писать свои собственные systemd службы для python.
ПРИМЕЧАНИЕ. Это относится не только к сценариям Python. Вы можете запустить любую программу с ним, независимо от языка программирования, на котором написана ваша программа.
Средства запуска python скриптов в backgdound
требуется запустить простенький python скрипт в background режиме для чего я в терминале ввожу ./name.py далее CTR+Z перевожу его ‘сворачиваю’ и когда требуется достаю с помощью bg. Проблема в том что я могу его ‘свернуть’ используя CTR+Z всего один раз. Т.е запустил скрипт, свернул его, вернул опять, и дальше я уже не могу не свернуть или даже просто остановить.
ps: запуск с добавлением логического И в конце, ничего не меняет.
Hex-Value
27.11.19 17:59:58 MSK

Dred ★★★★★
( 27.11.19 18:01:43 MSK )

Difrex ★★★★
( 27.11.19 18:02:25 MSK )
я в терминале ввожу ./name.py далее CTR+Z перевожу его ‘сворачиваю’ и когда требуется достаю с помощью bg
Вроде раньше bg отправлял job в background а для «доставания» в foreground использовался fg ?
alx777 ★★
( 27.11.19 18:28:16 MSK )
Ctrl+Z не сворачивает, а ставит на паузу. «Сворачивает» bg , разворачивает fg .
legolegs ★★★★★
( 27.11.19 18:39:31 MSK )

zolden ★★★★★
( 27.11.19 18:40:26 MSK )

- честно сделать daemon’а . google daemonize python https://pypi.org/project/python-daemon/
- открепить процесс от терминала. он по-прежнему не будет демоном, но вывод будет перенаправлен в файл. емнип, это необратимо
nohup python script.py &
- запускать в мультиплексоре терминалов вроде screen или tmux. опять же, это ни разу не демон, но ты можешь отключаться от сессии scren/tmux и по желанию подключаться снова
router ★★★★★
( 27.11.19 19:28:02 MSK )
Ответ на: комментарий от router 27.11.19 19:28:02 MSK
Пробую: code=nohup python 1.py > logs.txt& но ничего не выходит
Хочу на наглядном примере просто понять, каким самым простым способом я могу запустить скрипт в фоне и писать его результат работы его в файл, и если мне необходимо то вернуть его снова из фона.
Hex-Value
( 27.11.19 20:59:38 MSK ) автор топика
Последнее исправление: Hex-Value 27.11.19 21:21:26 MSK (всего исправлений: 5)
Ответ на: комментарий от Hex-Value 27.11.19 20:59:38 MSK

Используйте screen или tmux для такого.
ValdikSS ★★★★★
( 27.11.19 21:41:04 MSK )
Ответ на: комментарий от router 27.11.19 19:28:02 MSK

t184256 ★★★★★
( 28.11.19 00:29:19 MSK )
Для прототипа и тестов как написали выше screen или tmux.
В продакшене лучше что-нибудь серьезное использовать вроде supervisor
wisp ★★
( 28.11.19 00:31:50 MSK )
А зачем возвращать в foreground? Если настроить логирование для stdout/err то результат работы можно прочитать из файла.
wisp ★★
( 28.11.19 00:36:18 MSK )
Ответ на: комментарий от t184256 28.11.19 00:29:19 MSK

ЕМНИП, процесс тупо будет запущен в фоне, но прикреплён к тому же терминалу. При закрытии ssh сессии он будет убит, так что без nohup не катит
router ★★★★★
( 28.11.19 08:27:09 MSK )
$ systemd-run –user ./script.py
- вот это самое очевидное решение.
nohup если не пользуешься системным менеджером
anonymous
( 28.11.19 09:33:26 MSK )
Ответ на: комментарий от router 28.11.19 08:27:09 MSK

… что полностью устраивает ТСа, не?
t184256 ★★★★★
( 28.11.19 10:18:56 MSK )
Ответ на: комментарий от router 28.11.19 08:27:09 MSK
Задача: Хожу на сервер по ssh запускаю скрипт в фоне, который весь свой вывод в процессе работы ‘ложит’ в файл, скрипт должен работать бесконечно. Естественно я буду периодически переподключаться к серверу по ssh. Очень желательно иметь возможность вернуть скрипт из ‘фона’ каждый раз при подключении по ssh и посмотреть результат его работы в реальном времени.
Подвиду под общий знаменатель то что понял, у меня выбор один это использовать nohup, если я запускаю скрипт к примеру:
nohup ./script.py > logs.txt
То данные сохраняется в файл только после завершении работы nohup(т.е после CTR+Z). Так на всем протяжении работы nohup файл logs.txt остается пустой. Вот скрипт с которым пробую: https://onlinegdb.com/SJiIda6hB
PS: Люди выше писали про screen и tmux, я вкурсе их существования и даже использую, но как они мне помогут запускать скрипт в фоне на удаленном сервере я не совсем понимаю.
Hex-Value
( 29.11.19 01:26:25 MSK ) автор топика
Последнее исправление: Hex-Value 29.11.19 01:28:39 MSK (всего исправлений: 1)
Ответ на: комментарий от Hex-Value 29.11.19 01:26:25 MSK

ты либо альтернативный, либо прикидываешься. тебе нужны либо screen, либо tmux. задача же, которую ты решаешь — дебильная.
Anoxemian ★★★★★
( 29.11.19 01:34:47 MSK )
Ответ на: комментарий от Hex-Value 29.11.19 01:26:25 MSK

выше писали про screen и tmux, я вкурсе их существования и даже использую, но как они мне помогут запускать скрипт в фоне на удаленном сервере я не совсем понимаю.
screen -S jobs_name -d -m /your/script.sh запустит твой скрипт «в фоне», затем можешь закрывать ssh-сессию, отключаться,
подключаться снова, выполнишь screen -ls – он тебе выкатит список сейчас выполняющихся,
по screen -x имя_сессий можешь подключиться и посмотреть что там происходит
Как запустить python скрипт на Linux в виде demon
Admin
16.10.2022
Linux, Python
Описание процесса от создания БД и до запуска скрипта.
Соединяемся со своим сервером и дальше работаем через консоль.
Переносим локальный проект на сервер
Создаем директорию для нашего нового приложения:
cd /home/ploshadka/new-application
mkdir new-application
Клонируем свой git-проект на наш сервер:
git clone «git@github.com:nikname/name_repository.git» ./
Создаем виртуальное окружение python:
python3 -m venv venv
source venv/bin/activate
pip install —upgrade pip
pip install -r requirements.txt
Создаем БД в PostgreSQL
Подключаемся к PostgreSQL:
sudo su — postgres
CREATE DATABASE new-application TEMPLATE=template0 ENCODING ‘UTF-8’ LC_COLLATE ‘ru_RU.UTF-8’ LC_CTYPE ‘ru_RU.UTF-8’;
Назначаем привелегии новой таблице:
GRANT ALL PRIVILEGES ON DATABASE new-application TO ploshadka;
pg_restore -U ploshadka -d new-application /home/ploshadka/new-application/bd.tar
Выходим из postgres окружения:
В коде должно быть подключение к PostreSQL
Выдержка из примера подключения к PostreSQL вместе с логированием.
def create_connection (
db_name = ‘new-application’ ,
db_user = ‘ploshadka’ ,
db_password = ‘12345’ ,
db_host = ‘localhost’ ,
db_port = 5432
) :
connection = None
try :
connection = psycopg2. connect (
database = db_name ,
user = db_user ,
password = db_password ,
host = db_host ,
port = db_port ,
)
connection. autocommit = True
except psycopg2. OperationalError as error:
logger. info ( f ‘Ошибка: ‘ )
return connection
Создаем демон для запуска нашего скрипта на python
sudo nano /etc/systemd/system/new-application.service
Внутри этого файла вставляем:
Description=New Application
After=network.target
[Service]
User=ploshadka
Group=www-data
WorkingDirectory=/home/ploshadka/new-application
Environment=»PATH=/home/ploshadka/new-application/venv/bin»
ExecStart=/home/ploshadka/new-application/venv/bin/python bot.py —start
ExecStop=/home/ploshadka/new-application/venv/bin/python bot.py —stop
ExecReload=/home/ploshadka/new-application/venv/bin/python bot.py —restart
TimeoutSec=30
Restart=always
Команды для запуска, остановки, перезагрузки службы
sudo systemctl start new-application
sudo systemctl stop new-application
sudo systemctl start new-application
sudo systemctl reload new-application
Узнать статус работы:
sudo systemctl status new-application
Читайте также
У сайта нет цели самоокупаться, поэтому на сайте нет рекламы. Но если вам пригодилась информация, можете лайкнуть страницу, оставить комментарий или отправить мне подарок на чашечку кофе.