linux запустить скрипт как службу

Создание службы для запуска скрипта

Добрый день! Есть скрипт написанный на python он берет и записывает данные в базу SQLite в том же каталоге. Хочу запускать его как службу, сделал конфиг /etc/systemd/system/pythonscript.service

При запуске данной службы в логах ошибка python, что файл БД не найден. Подскажите, пожалуйста, как правильно создать службу или куда необходимо положить файл БД, чтоб это работало?

linux запустить скрипт как службу

Убери это, systemd — не шелл.

Type=oneshot или Type=simple

linux запустить скрипт как службу

Подскажите, пожалуйста, как правильно создать службу

linux запустить скрипт как службу

linux запустить скрипт как службу

При запуске данной службы в логах ошибка python, что файл БД не найден.

linux запустить скрипт как службу

linux запустить скрипт как службу

ExecStart = /usr/bin/python3 ‘/home/pi/script/index.py’ > /home/pi/script/script.log 2>$1

По-хорошему все эти «кишки» лучше прятать в ваш скрипт. Для логирования модуль logging.

Путь до файла бд в вашем случае вероятно тоже стоит указывать или абсолютный, или же определять через os.path.dirname. Это вам позволит убрать тучу спецэффектов с запуском скрипта.

linux запустить скрипт как службу

1. Создаёшь /usr/bin/pepiaka.sh, в котором пускаешь свой pepiaka.py. Проверяешь, как оно работает из консольки.

Если БД указана через relative-path его это никак не спасёт( FileNotFoundError)

Источник

Запуск скрипта sh в Linux

Вся сила Linux в использовании терминала. Это такая командная оболочка, где вы можете выполнять различные команды, которые будут быстро и эффективно выполнять различные действия. Ну впрочем, вы наверное это уже знаете. Для Linux было создано множество скриптов, которые выполняются в различных командных оболочках. Это очень удобно, вы просто объединяете несколько команд, которые выполняют определенное действие, а затем выполняете их одной командой или даже с помощью ярлыка.

Как работают скрипты

В Linux почти не используется расширение файла для опережения его типа на системном уровне. Это могут делать файловые менеджеры и то не всегда. Вместо этого, используются сигнатуры начала файла и специальные флаги. Система считает исполняемыми только те файлы, которым присвоен атрибут исполняемости.

Запуск скрипта sh в Linux

Сначала рассмотрим пример небольшого sh скрипта:

#!/bin/bash
echo «Hello world»

linux запустить скрипт как службу

chmod ugo+x script.sh

linux запустить скрипт как службуlinux запустить скрипт как службу

linux запустить скрипт как службу

Или полный путь от корня:

linux запустить скрипт как службу

cp script.sh /usr/local/bin/script.sh

Теперь вы можете выполнить:

linux запустить скрипт как службу

linux запустить скрипт как службу

А если нам нужно запустить скрипт на php, то выполните:

Вот так все просто здесь работает. Так можно запустить скрипт как фоновый процесс, используйте символ &:

Даже запустить процесс linux не так сложно.

Выводы

Источник

Управление службами Linux

В операционной системе linux, так же как и в Windows, кроме обычных программ, которые могут взаимодействовать с пользователем есть еще один вид программ. Это работающие в фоне службы. Важность служб тяжело переоценить, они следят за состоянием системы, обеспечивают автоматическое подключение внешних устройств и сети, позволяют процессам взаимодействовать с оборудованием (dbus), а также в виде служб реализованы различные веб-серверы и серверы баз данных. В отличие от пользовательских программ, службы выполняются в фоне, и пользователь не имеет к ним прямого доступа. Пользователь еще не вошел в систему, только началась загрузка а основные службы уже запущенны и работают.

В этой статье мы рассмотрим управление службами Linux. Мы не будем трогать уже устаревшие системы, такие как SysVinit, сосредоточимся только на Systemd. Вы узнаете, как посмотреть запущенные службы linux, а также останавливать и запускать их самому.

Немного теории

Но потом на смену этому методу пришла новая модель и система инициализации systemd. Система инициализации запускается сразу после загрузки ядра и начинает инициализировать службы, теперь появилась возможность параллельной инициализации, а также зависимостей между службами. Таким образом, теперь можно определить сложное дерево порядка запуска служб. Но мы не будем вникать в подробности создания служб, нас интересует только сам процесс запуска. После запуска systemd собирает весь вывод службы в лог, и следит за ее работой, если служба аварийно завершилась, то автоматически ее перезапускает.

Служба в Systemd описывается файлом юнита, в нем описано что с ней нужно делать и как себя вести. Существуют такие типы служб:

Нас будут интересовать только service, и совсем немного target, но мы рассмотрели все остальные, чтобы вы смогли взглянуть на картину немного шире. Основы рассмотрели, теперь будет настройка служб LInux.

Утилита systemctl

$ systemctl опции команда служба служба.

Рассмотрим все по порядку. Опции очень сильно зависят от команд, поэтому рассмотрим их позже, а пока пройдемся по командах:

А теперь основные опции:

Как видите, опции будут мало полезны и лучше обратить больше внимания на команды, с помощью них выполняются все действия.

Управление службами Linux

Теперь, когда вы уже знаете все основы, команды и параметры можно переходить к делу. Со всеми остальными тонкостями разберемся по пути. Сначала давайте посмотрим запущенные службы linux. Нас будут интересовать только программы, а не все эти дополнительные компоненты, поэтому воспользуемся опцией type:

linux запустить скрипт как службу

Следующая команда позволяет получить список служб linux, в который входят все службы, даже не запущенные, те, которые не запускались, но известны systemd, но это еще не все службы в системе:

linux запустить скрипт как службу

Дальше больше. Вы можете отсортировать список служб systemctl по состоянию. Например, только выполняющиеся:

linux запустить скрипт как службу

Или те, которые завершились с ошибкой:

linux запустить скрипт как службу

Для фильтрации можно брать любой показатель состояния из любой колонки. Другой командой мы можем посмотреть все файлы конфигурации служб на диске. Тут не будем фильтровать по типу, пусть программа покажет все:

Теперь отфильтруем только службы linux:

Здесь вы тоже можете использовать фильтры по состоянию. Теперь вы знаете как посмотреть запущенные службы linux, идем дальше.

Чтобы запустить службу используется команда start, например:

sudo systemctl start application.service

Причем расширение service можно опустить, оно и так подставляется по умолчанию. Если запуск прошел хорошо, программа ничего не выведет.

Остановить службу linux можно командой:

sudo systemctl stop application

Посмотреть состояние службы позволяет команда status:

sudo systemctl status application

linux запустить скрипт как службу

Здесь вы можете видеть, состояние running, exited, dead, failed и т д. А также несколько последних строчек вывода программы, которые очень помогут решить проблему с запуском если она возникнет.

Автозагрузка служб в systemd

Как вы знаете, systemd позволяет автоматически загружать службы при запуске системы по мере их надобности. Команда list-unit-files показывает добавлена ли служба в автозагрузку.

Поэтому чтобы получить список служб linux, запускаемых автоматически достаточно отфильтровать ее вывод по состоянию:

linux запустить скрипт как службу

linux запустить скрипт как службу

Все службы, запускаемые по умолчанию. Можете также посмотреть службы static. Чтобы добавить службу в автозагрузку linux используйте команду enable:

sudo systemctl enable application

linux запустить скрипт как службу

А для того чтобы убрать ее из автозагрузки:

sudo systemctl disable applciation

linux запустить скрипт как службу

Также, вы можете посмотреть разрешена ли сейчас автозагрзука для службы:

sudo systemctl is-enabled application

linux запустить скрипт как службу

Утилита просто выведет состояние enabled, disabled или static.

Выводы

Источник

Linux how to’s

Roman Pridybailo

Скрипты запускаемых служб в Linux располагаются в /etc/rc.d/init.d. Для того, чтобы скрипт запускался автоматически во время запуска системы, надо создать символическую ссылку на скрипт и разместить её в каталоге /etc/rc.d/rcN.d где N соответствует уровню выполнения скрипта.

Уровни инициализации LinuxОбозначиние
0остановка системы (halt) — работа системы должна быть прекращена
1однопользовательский режим работы — система инициализирует минимум служб и даёт единственному пользователю (как правило, суперпользователю) без проведения аутентификации командную строку. Как правило, этот режим используется для восстановления системы
2многопользовательский режим — пользователи могут работать на разных терминалах, вход в систему с процессом аутентификации
3многопользовательский сетевой режим — в отличие от предыдущего уровня, осуществляется настройка сети и запускаются различные
сетевые службы;
4не имеет стандартного толкования и практически не используется
5запуск графической подсистемы — по сравнению с уровнем 3 производится также старт графической подсистемы X11, и вход в систему осуществляется уже в графическом режиме
6перезагрузка системы — при включении этого режима останавливаются все запущенные программы и производится перезагрузка

Чаще всего во время загрузке система использует уровни загрузки 3 или 5. Однако есть некоторая хитрость в названии самой символической ссылки, о которой многие умалчивают, и о которой я хочу рассказать.

Источник

Как создать свой сервис для Linux

linux запустить скрипт как службу

Основы создания сервиса Linux

Если вы еще никогда не делали свои сервисы, начнем с основ. Systemd оперирует абстрактными единицами (unit), которые бывают разных типов, могут предоставлять различные ресурсы (процессы, сокеты, абстрактные «цели») и требовать других ресурсов для запуска.

Сервисы типа oneshot — долой rc.local

Когда-то основным способом добавить выполнение команд в загрузку системы было дописать их в /etc/rc.local. Очевидный недостаток — нет способов следить, насколько успешно они выполнились. В systemd легко создать для такой цели свой сервис типа oneshot, и им можно будет управлять через systemctl, как любым другим. В этом случае systemd выполнит команду и посчитает запуск сервиса успешным, если она завершилась с кодом ноль.

Сохраним следующий файл в /lib/systemd/system/dumb-test.service :

Создание сервиса из любой программы

Для демонстрации напишем программу на Python, которая просто выводит сообщение в бесконечном цикле. Сохраним в /usr/local/bin/test.py следующее:

Затем создадим для нее файл сервиса в /lib/systemd/system/smart-test.service :

Теперь можно запустить наш сервис и убедиться, что он работает:

Зависимости и порядок запуска

Опций для настройки зависимости в systemd очень много. Прежде всего нужно отметить, что в нем есть два независимых механизма для указания порядка запуска сервисов и зависимостей между ними.

Порядок запуска сервисов

Однако опция After=bar.service сама по себе не поставит сервис на загрузку. Более того, она никак не повлияет на решение запускать foo, даже если запуск bar завершится неудачей.

Причина существования этих опций — способность systemd запускать сервисы параллельно.

Для примера возьмем типичный веб-сервер с набором из веб-приложения FCGI, СУБД и обратного прокси. В каком порядке запускать процесс FCGI и обратный прокси, не так важно. Запросы будут работать, только когда они оба запущены, но «неверный порядок» никак не помешает им запуститься.

Зависимости

Зависимости бывают двух видов: мягкие и жесткие. Если оба сервиса запустились успешно, то никакой разницы между ними нет. Различие вступает в действие, если один из сервисов не смог запуститься: если зависимость мягкая, то зависимые сервисы все равно будут запущены, а если жесткая, то systemd не станет даже пробовать их запустить.

При копировании настроек из пакетов дистрибутива нужно быть осторожным. Разработчики дистрибутивов тоже люди и вполне могут создавать неоптимальные или ошибочные конфигурации. Кроме того, если что-то работает для одного сервиса, совсем не факт, что оно же подойдет для другого, так что сверяйтесь с документацией и тестируйте перед выпуском.

Внедрение в зависимости к чужим сервисам

В системах с System V init добавить что-то в зависимости к чужому сервису можно было, лишь отредактировав его скрипт. Такие изменения, очевидно, не переживут обновления системы, поэтому сделать их постоянными можно было бы только пересборкой пакета.

Источник

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

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