2

Я знаю, что есть программа с именем 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' снова, чтобы проверить ошибку.

5 ответов5

10

Вам не нужно ничего особенного, чтобы сделать демона, правда. Любая программа на любом языке может "демонизировать" себя. Кроме того, вы можете демонизировать существующую программу с помощью небольшой оболочки сценариев оболочки (например, программа запуска /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
3

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

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

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

2

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

1

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

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

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

#!/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
0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .