Простой способ демонизации в CentOS 5.4

15621
Saif Bechan

Я знаю, что есть программа с именем upstart, которая позволяет легко создавать маленьких демонов. Я не могу настроить эту программу на CentOS. Я получаю всевозможные ошибки, касающиеся pkg-congfig, libnih и dbus.

Я работаю над приложением node.ja, и мне сложно все время запускать и останавливать его, поэтому я хочу создать для этого демон, который облегчает запуск и остановку.

Обновление 1
Я приведу небольшой пример того, что мне нужно для этого проекта, я надеюсь, что кто-то может помочь с этим.

Чтобы запустить приложение node.js, я должен ввести SSH:

# node /path-to-file/filename.js 

Теперь, когда я выполняю это замораживание терминала, я должен нажать CTRL + Z (pc), чтобы получить ввод обратно.

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

Мне необходимо:

# killall -9 node 

Это убивает все запущенные приложения узла

Далее я должен снова запустить скрипт

# node /path-to-file/filename.js 

Я хочу просто напечатать

# myapp restart 

И все сделано. Этот тип установки сэкономил бы мне много времени

Обновление 2
Я нашел программу под названием monit. Это хорошо работает, и автоматически запускает приложение в случае сбоя, что хорошо. У этого также есть хороший веб-интерфейс, который также удобен.

я могу печатать

# monit myapp start(start/stop/restart) 

Это отлично работает. Есть только один недостаток, и это главный недостаток. Когда я запускаю приложение myapp, оно не отображает ошибки компиляции. Поэтому, когда он не запускается, я не буду знать, в чем причина. Я должен напечатать весь '# node /path-to-file/filename.js' снова, чтобы проверить ошибку.

2

5 ответов на вопрос

10
wazoox

Вам не нужно ничего особенного, чтобы сделать демона, правда. Любая программа на любом языке может «демонизировать» себя. Кроме того, вы можете демонизировать существующую программу с помощью небольшой оболочки сценариев оболочки (например, программа запуска /etc/init.d может позаботиться об этом).

Как правило, демон имеет следующие свойства:

  • рабочий каталог должен быть /
  • STDIN должен быть / dev / null
  • STDOUT и STDERR должны быть либо / dev / null, либо файлами журнала
  • родительский идентификатор должен быть init (1), его легко получить, разветвив и затем оставив родительский выход.

Обновление 1

Monit в основном заботится о мрачных подробностях, которые я здесь изложил. Для получения подробной информации о STDIN / STDOUT, / dev / null и т. Д. Это базовые концепции Unix, поэтому я думаю, вам придется рано или поздно разобраться в этом. Посмотрите, например, это введение в Unix .

Обновление 2

Сценарий оболочки, который демонизирует программу, будет выглядеть следующим образом. Обратите внимание, что это не будет работать для программ, которые остаются на переднем плане.

#!/bin/sh  DAEMON=/some/program/to/run PARAMETERS="parameters to my program" LOGFILE=/var/log/somefile.log  start() { echo -n "starting up $DAEMON" RUN=`cd / && $DAEMON $PARAMETERS > $LOGFILE 2>&1`  if [ "$?" -eq 0 ]; then echo "Done." else echo "FAILED." fi }  stop() { killall $DAEMON }  status() { killall -0 $DAEMON  if [ "$?" -eq 0 ]; then echo "Running." else echo "Not Running." fi }  case "$1" in start) start ;;  restart) stop sleep 2 start ;;  stop) stop ;;  status) status ;;  *) echo "usage : $0 start|restart|stop|status" ;; esac  exit 0 
Хорошо, я новичок в Linux, так что я не знаю, что все эти вещи. Можете ли вы дать мне небольшой пример того, как этого добиться. Я немного отредактирую вопрос, и, возможно, вы сможете мне помочь с этим конкретным типом настройки, потому что я понятия не имею, что такое стандартный ввод и т. Д. Saif Bechan 14 лет назад 0
Итак, я просто создаю файл (myapp) и просто добавляю #! / Bin / sh в начало строки. И когда я наберу имя файла, он будет работать как программа? Saif Bechan 14 лет назад 0
Спасибо, это поможет мне начать программу. Спасибо вам за помощь. Принятый ответ Saif Bechan 14 лет назад 0
Хороший ответ, хотя я бы добавил, что родительский процесс должен игнорировать SIGCHLD, чтобы init мог немедленно унаследовать потерянный процесс и не оставлять зомби в таблице процессов. Это легко сделать в сценариях с помощью команды NOHUP, но, как вы сказали, также подключите все 3 стандартных ввода-вывода. kmarsh 14 лет назад 0
Это прекрасно работает. Теперь у меня есть полный контроль над началом и остановкой казни. Это сэкономит мне огромное количество времени. Saif Bechan 14 лет назад 0
Не за что :) вы можете использовать этот скрипт как /etc/init.d/yourapp и использовать ваше приложение как полноценный сервис. Сообщения об ошибках будут отправляться в файл журнала (/ var / log / что угодно). wazoox 14 лет назад 0
Простое закрытие stdin и фоновый режим также работают: `` myprog 1 <& - & ``. Теперь у вас есть демон. w00t 12 лет назад 1
@woot, chdir в / root необходим, чтобы не предотвратить случайное отключение чего-либо. wazoox 12 лет назад 0
3
CGSMCMLXXV

Чтобы запустить скрипт в не взаимодействующем сеансе, используйте nohup(он отсоединит ваш процесс в автономном режиме).

Чтобы сделать ваш скрипт исполняемым, используйте chmod ugoa+x <script_name>.

Последний пункт, не используйте #!/bin/bashили #!/bin/shпотому что вы не знаете, находится ли в /bin; попробуйте использовать #!/usr/bin/env bash(или sh), который заставляет процесс работать в среде bash (sh). Обратите внимание, что он envсуществует все время /usr/binи в нем зарегистрированы пути всех сред (BASH, SH, TCSH ...).

@slhck вы на самом деле не редактировали что-то, вы просто записали одни и те же слова. Я собираюсь отметить это для модерации внимания. Saif Bechan 12 лет назад 0
@Saif slhck изменил эти слова на моноширинные элементы кода - поэтому `#! / Bin / bash` вместо #! / Bin / bash - и добавил разделение абзацев. Пост выглядит визуально проще для разбора, я не вижу ничего плохого в этом редактировании. DMA57361 12 лет назад 1
@Saif Как сказал DMA, это было намерение. Если у вас есть проблемы с этим, пожалуйста, объясните себя на [Meta] ... slhck 12 лет назад 0
2
HughE

Если вы пытаетесь демонизировать программу, в которой нет режима демона, вы можете использовать daemonize . Для этого есть RPM-пакеты в репозитории repoforge .

1
Dennis Williamson

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

Редактировать:

Вот простой пример сценария оболочки:

#!/bin/sh do-start-stuff () { stuff-to-do }  do-stop-stuff () { stuff-to-do }  case "$1" in start) do-start-stuff ;; stop) do-stop-stuff ;; restart) do-stop-stuff do-start-stuff ;; esac 
Можете ли вы указать мне, как создать сценарий оболочки. Saif Bechan 14 лет назад 0
Если я создаю файл с точными шагами, которые я делаю, как скрипт узнает, хочу ли я запустить или остановить его. Или я могу работать с if заявлениями внутри файла. Saif Bechan 14 лет назад 0
Да, вы можете иметь `if` и другие утверждения. Смотрите мое редактирование. Dennis Williamson 14 лет назад 0
Спасибо за помощь. Я проверю код и получу основную идею. Спасибо вам за помощь. +1 за ответ. Ответ wazoox был чуть более подробным, поэтому я принял его ответ. Saif Bechan 14 лет назад 0
0
Journeyman Geek

если вам нужно запустить одно приложение, которое выводит на консоль, но не хотите, чтобы оно монополизировало экран использования вашего терминала, затем отсоедините его - введите screen, нажмите enter, запустите ваше приложение как обычно, затем нажмите f6, чтобы выйти. screen -r возвращается в приложение

Похожие вопросы