Назад | Перейти на главную страницу

Превращение скрипта в службу Linux

- ИЗМЕНИТЬ, все еще есть проблемы -

Хорошо, мой сценарий использует цикл для ожидания сетевых подключений. Поэтому, когда я запускаю его, даже с демоном он просто сидит и не возвращает меня в оболочку. Я попытался su -c "/home/webreports/report-list &" USER но он пытался запускаться как пользователь, и хотя он у меня в кавычках, я даже пробовал одинарные кавычки.

- Оригинал - я создал сценарий (еще предстоит протестировать) для запуска сценария bash как службы. У меня два вопроса.

1) как заставить его работать от имени конкретного пользователя? программное обеспечение, которое мы используем, НЕ МОЖЕТ запускаться от имени пользователя root, и в этом случае оно приведет к ужасным сбоям (ужасное программное обеспечение, с которым мы, к сожалению, застряли). Итак, как мне заставить его запускать службу от имени пользователя «JOEBOB», скажем.

2) Могу ли я просто поместить файл сценария в "/etc/rc5.d", чтобы иметь возможность использовать "служебный отчет-запуск прослушивания"?

--- Скрипт -

#!/bin/sh
#
# myservice     This shell script takes care of starting and stopping
#               the /home/webreports/report-listen
#

# Source function library
. /etc/rc.d/init.d/functions


# Do preliminary checks here, if any
#### START of preliminary checks #########


##### END of preliminary checks #######


# Handle manual control parameters like start, stop, status, restart, etc.

case "$1" in
  start)
    # Start daemons.

    echo -n $"Starting report-listen daemon: "
    echo
    daemon /home/webreports/report-listen
    echo
    ;;

  stop)
    # Stop daemons.
    echo -n $"Shutting down report-listen: "
    killproc /home/webreports/report-listen
    echo

    # Do clean-up works here like removing pid files from /var/run, etc.
    ;;
  status)
    status /home/webreports/report-listen

    ;;
  restart)
    $0 stop
    $0 start
    ;;

  *)
    echo $"Usage: $0 {start|stop|status|restart}"
    exit 1
esac

exit 0

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

Использовать su чтобы запустить скрипт от имени другого пользователя:

daemon su -c /home/webreports/report-listen johndoe

где johndoe - это пользователь, от имени которого вы хотите его запустить.

Поместите сценарий в /etc/init.d/myservice, затем создайте символическую ссылку на /etc/rc.d/S99myservice.

Если вы используете Ubuntu (ОС на основе Debian), вы можете основать свой скрипт на /etc/init.d/skeleton и заменить DAMEON var:

DAEMON=su -c "/home/webreports/report-listen" joebob

У вас также будет файл pid для чистого запуска / остановки.

Вы можете запустить его автоматически во время загрузки с помощью (при условии, что ваш служебный скрипт называется /etc/init.d/my-report-listen):

$ sudo update-rc.d my-report-listen defaults

Этот метод - всего лишь попытка, а не прием, который работает. Я надеюсь, что это помогает

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

Видеть http://cr.yp.to/daemontools.html за документально все офигенно.

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

Чтобы ответить на первую часть вашего вопроса, о запуске скрипта при запуске. Вы должны поместить сценарий в /etc/rc.d/init.d и добавить строку, совместимую с "chkconfig", чтобы вы могли добавить его на нужные уровни с помощью команды "chkconfig". см предыдущий вопрос по этому вопросу.

Что касается запуска скрипта с конкретным пользователем. Поскольку вы уже используете функцию "демон", вы можете попробовать использовать "--пользователь"переключатель:

daemon --user=reportsuser /home/webreports/report-listen