Запустить скрипт sh в linux как демон
Я написал Python script, который проверяет определенный адрес электронной почты и передает новые электронные письма во внешнюю программу. Как я могу заставить этот script выполнять 24/7, например, превратить его в демон или службу в Linux. Нужен ли мне цикл, который никогда не заканчивается в программе, или это можно сделать, просто повторив код повторно несколько раз?
ОТВЕТЫ
Ответ 1
У вас есть два варианта здесь.
Сделайте правильную работу cron, которая вызывает ваш скрипт. Cron - это общее имя для демона GNU/Linux, который периодически запускает сценарии в соответствии с заданным вами расписанием. Вы добавляете свой скрипт в crontab или помещаете символическую ссылку на него в специальный каталог, и демон выполняет его запуск в фоновом режиме. Вы можете прочитать больше в Википедии. Существует множество различных демонов cron, но в вашей системе GNU/Linux она должна быть уже установлена.
Используйте некоторый подход к Python (например, библиотеку), чтобы ваш скрипт мог демонизировать себя. Да, это потребует простой циклы событий (где ваши события запускаются по таймеру, возможно, обеспечивается функцией сна).
Я бы не рекомендовал вам выбирать 2., потому что вы на самом деле повторяете функциональность cron. Системная парадигма Linux - позволить нескольким простым инструментам взаимодействовать и решать ваши проблемы. Если нет дополнительных причин, по которым вы должны создавать демона (помимо периодического запуска), выберите другой подход.
Также, если вы используете daemonize с циклом и происходит сбой, никто не будет проверять почту после этого (как указал Иван Невоструев в комментариях к этому ответу). Хотя, если скрипт добавлен как задание cron, он просто сработает снова.
Ответ 2
Здесь хороший класс, который взят из здесь:
Ответ 3
Вы должны использовать библиотеку python-daemon, она заботится обо всем.
Из PyPI: Library для реализации хорошо зарекомендовавшего себя процесса демона Unix.
Ответ 4
Вы можете использовать fork(), чтобы отсоединить ваш script от tty и продолжить его, например:
Конечно, вам также нужно реализовать бесконечный цикл, например
Надеюсь, вы начнете.
Ответ 5
Вы также можете запустить python script как службу с помощью оболочки script. Сначала создайте оболочку script для запуска python script, как это (имя файла сценария)
теперь создайте файл в /etc/init.d/scriptname
Теперь вы можете запустить и остановить ваш python script с помощью команды /etc/init.d/scriptname start или stop.
Ответ 6
cron - отличный выбор для многих целей. Однако он не создает службу или демон, как вы просили в OP. cron просто запускает задания периодически (это означает, что задание запускается и останавливается) и не чаще, чем раз в минуту. Существуют проблемы с cron - например, если предыдущий экземпляр вашего script все еще работает при следующем расписании cron и запускает новый экземпляр, это нормально? cron не обрабатывает зависимости; он просто пытается начать работу, когда расписание говорит.
Если вы обнаружите ситуацию, когда вам действительно нужен демон (процесс, который никогда не перестает работать), взгляните на supervisord . Он предоставляет простой способ обернуть нормальную, не-daemonized script или программу и заставить ее работать как демон. Это намного лучший способ, чем создание собственного демона Python.
Ответ 7
Простая и поддерживаемая версия - это Deamonize Install it from Python Package Index (PyPI):
а затем использовать как:
Ответ 8
как использовать команду $nohup в linux?
Я использую его для запуска моих команд на моем сервере Bluehost.
Прошу совета, если я ошибаюсь.
Ответ 9
Сначала прочитайте псевдонимы почты. Почтовый псевдоним будет делать это в почтовой системе, если вам не придется обманывать демонов или сервисов или что-то в этом роде.
Если вы действительно хотите написать ненужный сложный сервер, вы можете сделать это.
Это все, что нужно. Ваш script просто петли и спит.
Ответ 10
Ответ 11
Если вы используете терминал (ssh или что-то еще), и вы хотите сохранить долговременную работу script после выхода из терминала, вы можете попробовать следующее:
apt-get install screen
создать виртуальный терминал внутри (а именно abc): screen -dmS abc
теперь мы подключаемся к abc: screen -r abc
Итак, теперь мы можем запустить python script: python Keep_sending_mail.py
с этого момента вы можете напрямую закрыть терминал, однако python script будет продолжать работать, а не закрываться
Так как этот Keep_sending_mail.py PID принадлежит виртуальному экрану, а не Терминал (SSH)
Если вы хотите вернуться, проверьте состояние работы script, вы можете снова использовать screen -r abc
Ответ 12
Используйте любой менеджер услуг, который предлагает ваша система, например, в Ubuntu используйте выскочку. Это будет обрабатывать все детали для вас, такие как запуск при загрузке, перезагрузка при сбое и т.д.
Ответ 13
Я бы рекомендовал это решение. Вам нужно наследовать и переопределить метод run .
Ответ 14
Он не использует ничего конкретного для любого дистрибутива, если используется chkconfig, при запуске системы.
Ответ 15
чтобы создать что-то, что работает как сервис, вы можете использовать эту вещь:
Первое, что вам нужно сделать, это установить Cement framework: Работа с рамкой Цемента - это работа кадра CLI, на которую вы можете развернуть свое приложение.
интерфейс командной строки приложения:
Имейте в виду, что ваше приложение должно запускаться в потоке, чтобы быть демоном
Всякий раз, когда я открываю файл .sh, он открывает его в gedit вместо терминала. Я не могу найти ни одной опции, похожей на Правый клик → Открыть с помощью → Другое приложение . → Терминал .
Как мне открыть этот файл в терминале?
Этот сценарий предназначен для установки переменных env для дальнейшего использования? Вы не должны использовать расширения в скриптах. В какой-то момент в будущем вы можете обнаружить, что другой язык больше подходит для выполнения задачи, выполняемой вашим текущим сценарием. И тогда у вас есть проблема. Вы сохраняете старое имя с полностью вводящим в заблуждение расширением или переименовываете его, возможно, приходится редактировать много мест, где используется ваш скрипт? Вам не нужно расширение файла. Приятно иметь, но не нужно. ОС не смотрит на расширение файла. Смотрит на данные Мех, если вы переписываете foo.sh в ruby, вы всегда можете использовать файл .sh для запуска ruby foo.rbДайте разрешение на выполнение вашего скрипта:
И запустить ваш скрипт:
Поскольку . ссылается на текущий каталог: если он yourscript.sh находится в текущем каталоге, вы можете упростить это до:
+1 только ответ, чтобы показать добавление прав на выполнение в терминале только способом. Если вы делаете, bash /path/to/yourscript.sh то вам не нужно chmod +x На самом деле, вы можете использовать, . /path/to/yourscript.sh если сценарий должен установить некоторые переменные среды. Никто не упоминает традиционное: ./path/to/yourscript.sh (без пробела после . )? Я считаю, что один из них самый простой и простой в использовании . Но в любом случае, вот мой вариант, который должен делать почти то же самое ./ , что и я, хотя я не понимаю, почему вы не будете использовать ./ : (FILENAME=Вам нужно пометить сценарии оболочки как исполняемые, чтобы запустить их из файлового менеджера:
Щелкните правой кнопкой мыши по вашему .sh файлу и выберите Свойства :
На вкладке « Разрешения » установите флажок « Разрешить выполнение файла как программы» :
Закройте окно « Свойства» и дважды щелкните файл. Появится диалоговое окно, дающее вам возможность запустить скрипт в терминале:
Откройте терминал и перейдите к папке, в которой находится .sh файл. Затем введите:
лучший способ открыть любое приложение. Перейдите в каталог .sh, затем откройте его в командной строке. используйте sh <имя файла, как показано выше> .sh, если для этого требуется разрешение, используйте chmod + x /path/to/yourscript.sh или щелкните правой кнопкой мыши и измените разрешение на всенеобходимое условие
Прежде чем вы сможете запустить файл .sh, вы должны сделать его исполняемым:
- Щелкните правой кнопкой мыши файл
- Выберите Свойства
- Выберите разрешения
- Выберите Разрешить выполнение файла в качестве программы
Предупреждение
Убедитесь, что вы доверяете источнику, откуда вы получили файл. Это может быть вирус .
Очень простой способ
- Дважды щелкните файл
- Нажмите запустить в терминале
Это имеет проблемы. Терминал немедленно закроется, и вы не сможете увидеть вывод.
Простой способ
- Открытые приложения -> Аксессуары -> Терминал
- Перетащите файл .sh в терминал и нажмите Enter
Как это делают профессионалы
Найти где .sh файл
- Используйте ls и cd команды
- ls отобразит список файлов и папок в текущей папке . Попробуйте: введите «ls» и нажмите Enter.
- Как только вы увидите папку, в которую хотите войти, запустите cd , затем пробел, а затем имя папки.
- Если вы попали в папку, которая вам не нужна, бегите, cd .. чтобы перейти на один уровень вверх
Запустите файл .sh
Как только вы можете увидеть, например, script1.sh с помощью ls этого:
Почему это сложный путь?
Терминал имеет богатый набор мощных инструментов, которые доступны при наборе команд. Профессионалы находят файл .sh, набирая ls и cd . Как только вы окажетесь в правильной текущей папке, вы можете запустить скрипт следующим образом:
Есть тысячи вещей, которые вы можете добавить в этот файл, просто набрав несколько команд.
Еще один, вы можете скачать файл из Интернета с помощью одной простой команды:
А затем откройте файл следующим образом:
Я не уверен , что профессионалы способ сделать это правильно, это скорее случай простой способ продвинутый (для контроля продукции) способ Приятно знать, что я сделал это так, как это делают профессионалы в моем первом испытании. Я думал, что это был основной способ пользователя.В Ubuntu 13.04 исполняемые файлы, открытые в Nautilus, теперь по умолчанию открываются в gedit, а не пользователю, запрашивающему их выполнить. Чтобы включить классическое поведение, вам нужно настроить параметры:
Наутилус → Меню Правка → Настройки → Вкладка «Поведение» → Каждый раз нажимайте переключатель рядом с вопросом.
Человек, который задал вопрос, говорит об Ubuntu 10.10 Спасибо. Я не знаю, почему они это изменили, не мог понять, как что-либо выполнить. Начиная с Ubuntu 18.04, вы можете получить доступ к настройкам, открыв каталог и нажав «Файлы -> Настройки» в верхней панели.Перейдите в каталог, где находится .sh файл с помощью cd . В этом примере я сохранил свой sh файл как
сначала pwd выясните, где вы находитесь, и если он вернется /home/username (где username ваше настоящее имя пользователя), вы можете запустить
Если вы, кажется, где-то еще, вы можете использовать абсолютный путь
Это все способы описания одного и того же места. Как только вы дойдете до места расположения вашего скрипта, введите
Если вы видите sh файл в выводе, вы можете использовать chmod его для запуска. В моем случае, помните, имя файла test.sh , поэтому я бы запустить
Теперь, когда мы находимся в том же каталоге, что и скрипт, мы должны указать оболочке, что мы хотим выполнить файл, указав его местоположение ./ (текущий каталог, за которым следует разделитель пути, чтобы отличить его от имени файла). Чтобы запустить мой файл, я набрал бы:
Если ваш скрипт написан правильно, он будет работать без ошибок .
Вот живой пример:
У меня есть script, который запускает мой PHP скрипт каждый X раз:
Как я могу запустить его как демон?
ОТВЕТЫ
Ответ 1
Это полностью отключит процесс от текущей оболочки (stdin, stdout и stderr). Если вы хотите сохранить вывод в файле журнала, замените первый /dev/null на ваш /path/to/logfile.
Ответ 2
Daemon - это просто программа, которая работает как фоновый процесс, а не находится под прямым контролем интерактивного пользователя.
[Ниже приведен код bash для систем Debian - дистрибутивы Ubuntu, Linux Mint и т.д.)
Простой способ:
Простым способом было бы отредактировать файл /etc/rc.local, а затем просто запустить script (т.е. каждый раз при загрузке системы):
Добавьте следующее и сохраните:
Лучший способ сделать это - создать Daemon через Upstart:
Подтвердите, что он выглядит нормально:
Теперь перезагрузите компьютер:
Теперь, когда вы загружаете свою систему, вы можете увидеть файл журнала, в котором указано, что ваш Daemon запущен:
& бык; Теперь вы можете запустить/остановить/перезапустить/получить статус своего демона с помощью:
перезагрузка: это остановится, а затем запустите службу
start: это запустит службу, если она не запущена
stop: это остановит службу, если она работает
статус: это покажет статус службы
Ответ 3
Вы можете перейти к /etc/init.d/- вы увидите шаблон демона, называемый скелетом.
Вы можете его дублировать, а затем ввести script в функции запуска.
Ответ 4
Еще один интересный трюк - запустить функции или подоболочки в фоновом режиме, не всегда выполнимые, хотя
Запуск подоболочки в фоновом режиме
Ответ 5
Некоторые комментаторы уже заявили, что ответы на ваш вопрос не будут работать для всех дистрибутивов. Поскольку вы не включили CentOS в вопрос, а только в теги, я хотел бы опубликовать здесь темы, которые необходимо понять, чтобы иметь возможность контролировать его/ее работу независимо от распределения:
- что такое демон init (необязательно)
- что такое файл inittab (/etc/inittab)
- что делает файл inittab в вашем дистрибутиве (например, запускает ли он все скрипты в /etc/init.d?)
Для вашей проблемы можно запустить скрипт в sysinit, добавив эту строку в /etc/inittab и сделав его респавн в случае его завершения:
В операционных системах семейства Linux запущенные фоном скрипты и программы, которые не взаимодействуют напрямую с пользователем, называют демонами. Зачастую, но не всегда, демоны загружаются вместе с операционной системой. Самым ярким примером демона может служить сервер сетевого протокола или же менеджеры для периодического выполнения задач ( cron ).
Демон процессы можно классически создать используя системные вызовы fork и execve с отключенной оболочкой для потока или нового процесса, однако для нас сегодня это слишком низкий уровень. Более простым инструментом для создания и контроля состояния демонов является systemd.
Systemd - относительно новая подсистема иницализации и управления демонами Linux. Первый выпуск данной подсистемы был осуществлён в марте 2010 года, сама подсистема была призвана заменить существующую систему init. Данная подсистема оперирует таким понятием, как модуль. А аналогом демонов является понятие "служба", это один из подвидов модуля, далее в статье демоны будут пониматься как службы.
Рассмотрим поближе модули
- .target - модуль для группировки модулей, позволяет реализовывать концепцию уровней запуска
- .service - отвечает за запуск сервисов (служб )или, как мы их называем, демонов;
- .mount - отвечает за монтирование файловых систем;
- .automount - по сути то же самое, что и mount, с той лишь разницей, что вызывается при фактическом обращении к точке монтирования;
- .swap - модули для работы с файлом подкачки;
- .timer - модули позволяющие организовать запуск других модулей по расписанию;
- .socket — предоставляет службам поддержку механизма сокет-активации;
- .slice — отвечает за создание контейнера cgroups;
- .device — позволяет реагировать на подключение устройств;
- .path — управляет иерархией файловой системы.
Непосредственно создание демона
Теперь перейдём непосредственно к созданию демона. Я буду показывать пример создания демона на основе скрипта LogCleaner, который позволяет чистить директории от файлов, сохраняя структуру директорий. Работу разделим на 3 части:
- Скрипт установки нашего демона;
- Модуль типа .service для запуска нашего скрипта как демона;
- Модуль типа .timer для периодического запуска демона;
1. Скрипт установки
Определимся с функционалом данного скрипта. Наш демон не будет зависеть от других модулей, не будет зависеть от дистрибутива и будет требовать лишь наличие systemd. Исходя из этого всего мы можем полагать, что файлы описывающие модули будут идентичны для разных дистрибутивов, поэтому скрипту установки не нужно будет их генерировать, он может их просто скопировать.
Далее, чтобы при удалении пользователей в системе наш скрипт не удалился вместе с домашней директорией, выберем место хранения. Идеальным местом будет директория /opt , к ней имеют доступ все пользователи, а если скрипт вдруг нужно удалить, то достаточно будет убрать его оттуда ( главное не забыть удалить модули ).
После того, как мы скопировали скрипт в директорию opt, нужно скопировать наши модули. Все системные модули systemd хранит в директории /etc/systemd/system , туда их и скопируем.
Далее останется активировать таймер и добавить его в автозагрузку.
Таким образом получаем скрипт установки для оболочки bash:
Основным файлом, который и будет запускать наш скрипт, является файл с расширением .service. Формат модулей systemd напоминает файлы формата .ini, в модулях systemd также есть секции и директивы, пример:
Для создания простого демона нам нужны всего 2 секции: Unit и Service. В секцию Unit мы добавим описание нашего сервиса, а в секции Service укажем какой файл нужно запускать и как. В итоге получим такой файл:
3. Модуль типа .timer
Последнее, что нам остаётся написать - это модуль типа .timer. Данный модуль будет запускать наш основной сервис раз в пять минут. Для данного модуля нам нужны секции Unit, Timer и Install.
В секции Unit также будет описание нашего сервиса.
В секции Timer мы добавим, что хотим запустить сервис через минуту после старта системы и после каждые 5 минут.
В секции Install мы укажем какой сервис мы хотим запускать.
Читайте также: