Как запустить скрипт python в ubuntu
Перейти к содержимому

Как запустить скрипт python в ubuntu

  • автор:

Как запустить приложение 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 )

  1. честно сделать daemon’а . google daemonize python https://pypi.org/project/python-daemon/
  2. открепить процесс от терминала. он по-прежнему не будет демоном, но вывод будет перенаправлен в файл. емнип, это необратимо

nohup python script.py &

  1. запускать в мультиплексоре терминалов вроде 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

Читайте также

У сайта нет цели самоокупаться, поэтому на сайте нет рекламы. Но если вам пригодилась информация, можете лайкнуть страницу, оставить комментарий или отправить мне подарок на чашечку кофе.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *