- ИЗМЕНИТЬ, все еще есть проблемы -
Хорошо, мой сценарий использует цикл для ожидания сетевых подключений. Поэтому, когда я запускаю его, даже с демоном он просто сидит и не возвращает меня в оболочку. Я попытался 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