LinuxForum.Fans
Тема

Запуск скрипта как сервиса (/etc/init.d)

Автор: ufomen 25 сообщений 11320 просмотров
#108014

Привет всем,

У меня есть управляющий скрипт который позволяет запустить, остановить или перезагрузить программку

# /opt/someprog/startup_script start

И сервис стартует от имени пользователя который его запустил.
НО например мы выделили специального пользователя dude для этого, задача в том чтобы зарегистрировать такой скрипт в сервисах линукс, и запускать его (и это САМОЕ ВАЖНОЕ) от нужного пользователя. Шаблон файла сервисов я нашел, но вот как сделать так, чтобы скрипт в любом случае (по sudo, при загрузке т.д.) запускался от пользователя dude.
У апача например этот параметр есть в конфиге.

Хелп плз! smile

#108016

[console]man su[/console]

#108019

Хм... Ну man su это здорово, а чуть подробнее?
Сделать в начале инит скрипта переход к нужному юзеру, а в конце возврат обратно? Я на самом деле примерно так и думал.
только как это реализовать чтоб "по феншую", а не колхозно-костыльный вариант.
Пример посмотреть можно? :rolleyes:

#108023

Сделать в начале инит скрипта переход к нужному юзеру,
так команда su это и делает...
[console]
su <user name> -c <command>
[/console]
#108027

Что делает su я знаю,
И как уже и говорил, это первое о чем я подумал, вопрос в том, правильно ли и по стандартам применить su в инит скрипте для решения такой задачи, или правильнее будет сделать это по другому, хотя думаю что Ваш ответ убедил меня.

#108031

Хотя странно что в других инит скриптах запускающихся от юзеров специально для этого выделенных я не вижу использования su ... :o

#108032

ufomen, в других скриптах, возможно, запускаются сервисы, позволяющие указать пользователя в опциях. Что вы хотите запустить своим скриптом?

#108034
Lupo Alberto написал:
ufomen, в других скриптах, возможно, запускаются сервисы, позволяющие указать пользователя в опциях. Что вы хотите запустить своим скриптом?

Вообще есть несколько таких сервисов например "atlassian bamboo"

по ману запускать его нужно так:

Launch via bamboo.sh startup script

You can start Bamboo with the default bamboo.sh file in your installation root directory. The bamboo.sh command accepts the following options (e.g. ./bamboo.sh start):

* start — this starts Bamboo.
* stop — this stops Bamboo.
* restart — this restarts Bamboo
* status — this provides the current status of Bamboo.


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

Есть еще несколько подобных программок которые хотелось бы зарегистрировать как сервисы и не париться. Но хочется сделать это ПРАВИЛЬНО.

Конфига с параметром пользователя увы нет... запускается от имени запустившего.

#108036
ufomen написал:
./bamboo.sh

Если не секрет, покажите полностью этот скрипт.

#108043
Lupo Alberto написал:
[quote=ufomen]./bamboo.sh

Если не секрет, покажите полностью этот скрипт.[/quote]

Сейчас уже дома, завтра выложу.
Не думаю что правильно будет менять что-то в этом скрипте, скорее нужно создать свой инит, либо с использованием su либо еще как-то. Поэтому хочется услышать варианты ;)
Конечно очень хотелось бы найти пример где это уже решалось правильно и по стандартам. wink

#108045
ufomen написал:
Не думаю что правильно будет менять что-то в этом скрипте

Данный скрипт — просто «обёртка» для какой-то команды, вот я бы и хотел посмотреть, что это за команда, ну и опции её запуска «погуглить».

#108055
Lupo Alberto написал:
[quote=ufomen]Не думаю что правильно будет менять что-то в этом скрипте

Данный скрипт — просто «обёртка» для какой-то команды, вот я бы и хотел посмотреть, что это за команда, ну и опции её запуска «погуглить».[/quote]

Качнул версию 2.6.1 отсюда http://www.atlassian.com/software/bamboo/ArchiveBambooDownloads.jspa
Собственно выкладываю сам скрипт.

text

#!/bin/bash
#
# ------------------------------------------------------
# Bamboo Startup Script for Unix
# ------------------------------------------------------

# # Check correct command line usage # usage() { echo "Usage: $0 {start|stop|restart|status}" exit 1 }

[ $# -gt 0 ] || usage

# # Get the action & configs # ACTION=$1

# # Ensure the BAMBOO_INSTALL var for this script points to the # home directory where Bamboo is is installed on your system. #

BAMBOO_INSTALL=.

export JAVA_HOME export BAMBOO_INSTALL

# # Find a PID for the pid file # if [ -z "$BAMBOO_PID" ] then BAMBOO_PID="$BAMBOO_INSTALL/bamboo.pid" fi

# # Find a location for the bamboo console # if [ -z "$BAMBOO_CONSOLE" ] then if [ -w /dev/console ] then BAMBOO_CONSOLE=/dev/console else BAMBOO_CONSOLE=/dev/tty fi fi

# # Are we running on Windows? Could be, with Cygwin/NT. # case "`uname`" in CYGWIN*) PATH_SEPARATOR=";";; *) PATH_SEPARATOR=":";; esac

# # Save the current CLASSPATH # OLDCLASSPATH=$CLASSPATH

# # Put the javac compiler in the classpath; # #CLASSPATH=$JAVA_HOME/lib/tools.jar

# # Add the bamboo classes in the classpath # CLASSPATH=$CLASSPATH$PATH_SEPARATOR$BAMBOO_INSTALL/webapp/WEB-INF/classes/

# # Now add in the bamboo library jars # CLASSPATH=$CLASSPATH$PATH_SEPARATOR$(ls $BAMBOO_INSTALL/webapp/WEB-INF/lib/commons-lang-*.jar | paste -s -d"$PATH_SEPARATOR" - ) CLASSPATH=$CLASSPATH$PATH_SEPARATOR$(ls $BAMBOO_INSTALL/webapp/WEB-INF/lib/servlet-api-2.5*.jar | paste -s -d"$PATH_SEPARATOR" - ) CLASSPATH=$CLASSPATH$PATH_SEPARATOR$(ls $BAMBOO_INSTALL/webapp/WEB-INF/lib/jetty-*.jar | paste -s -d"$PATH_SEPARATOR" - ) CLASSPATH=$CLASSPATH$PATH_SEPARATOR$(ls $BAMBOO_INSTALL/webapp/WEB-INF/lib/mail-*.jar | paste -s -d"$PATH_SEPARATOR" - )

# # Append old classpath to current classpath # if [ ! -z "$OLDCLASSPATH" ]; then CLASSPATH=${CLASSPATH}:$OLDCLASSPATH fi

# # This is how the Bamboo server will be started # RUN_CMD="java -server -Xms256m -Xmx512m -XX:MaxPermSize=256m -Djava.awt.headless=true -classpath $CLASSPATH -Dorg.mortbay.xml.XmlParser.NotValidating=true -Djetty.port=8085 com.atlassian.bamboo.server.Server 8085 ./webapp /"

# # Do the action # case "$ACTION" in start) echo "Starting Bamboo: "

if [ -f $BAMBOO_PID ] then echo "Already Running!!" exit 1 fi

echo "STARTED Bamboo `date`" >> $BAMBOO_CONSOLE

cd $BAMBOO_INSTALL nohup sh -c "exec $RUN_CMD 2>&1" >$BAMBOO_INSTALL/logs/bamboo.log & echo $! > $BAMBOO_PID echo "Bamboo running pid="`cat $BAMBOO_PID` ;;

console) echo "Starting Bamboo: "

if [ -f $BAMBOO_PID ] then echo "Already Running!!" exit 1 fi

echo "STARTED Bamboo `date`" >> $BAMBOO_CONSOLE

cd $BAMBOO_INSTALL eval $RUN_CMD ;; stop) PID=`cat $BAMBOO_PID 2>/dev/null` echo "Shutting down Bamboo: $PID" kill $PID 2>/dev/null sleep 2 kill -9 $PID 2>/dev/null rm -f $BAMBOO_PID echo "STOPPED `date`" >>$BAMBOO_CONSOLE ;;

restart) $0 stop $* sleep 5 $0 start $* ;;

status) if [ -f $BAMBOO_INSTALL/bamboo.pid ] then echo "Bamboo running pid="`cat $BAMBOO_INSTALL/bamboo.pid` exit 0 else echo "Bamboo is currently not running." fi exit 1 ;;

*) usage ;; esac

exit 0

#108092

ufomen, сейчас уже сооброжаю плохо, но во многих скриптах, если их посмотреть поподробнее, то можно увидеть дефолтные параметры запуска а-ля -u username --defaults=/path/to/file.conf и тп. В Вашем случае такое не канает? Простенький скрипт запуска можно написать самому, исходя из этого.

#108138
Denlookh написал:
ufomen, сейчас уже сооброжаю плохо, но во многих скриптах, если их посмотреть поподробнее, то можно увидеть дефолтные параметры запуска а-ля -u username --defaults=/path/to/file.conf и тп. В Вашем случае такое не канает? Простенький скрипт запуска можно написать самому, исходя из этого.

Ну команда запуска тут

RUN_CMD="java -server -Xms256m -Xmx512m -XX:MaxPermSize=256m -Djava.awt.headless=true -classpath $CLASSPATH -Dorg.mortbay.xml.XmlParser.NotValidating=true -Djetty.port=8085 com.atlassian.bamboo.server.Server 8085 ./webapp /"

#108144

ufomen, а в документации к программе нигде нет описания опций, с которыми она может запускаться?
В конце концов, можно чуть изменить скрипт, добавив к команде запуска su ...

#108148
Lupo Alberto написал:
ufomen, а в документации к программе нигде нет описания опций, с которыми она может запускаться?
В конце концов, можно чуть изменить скрипт, добавив к команде запуска su ...

Можно и изменить, но...
При апдейте скрипт скорее всего перезапишется, это раз. Как вариант создать инит с su который в свою очередь будет запускать этот скрипт от имени нужного пользователя.
Хотя теперь уже и не знаю, интересно почему изначально это было не реализовано как сервис с инит скриптом?...

#108151

ufomen, а, кстати, как именно вы устанавливали программу? Посредством менеджера управления пакетами либо вручную? И почему созданный вами скрипт должен перезаписаться? Чуть изменить имя — и всё! Да и чтоб совсем всё было по «феншую», поместите его куда-либо, в зависимости от вашего дистрибутива, в /etc/init.d/rc.local.

#108153
Lupo Alberto написал:
ufomen, а, кстати, как именно вы устанавливали программу? Посредством менеджера управления пакетами либо вручную? И почему созданный вами скрипт должен перезаписаться? Чуть изменить имя — и всё! Да и чтоб совсем всё было по «феншую», поместите его куда-либо, в зависимости от вашего дистрибутива, в /etc/init.d/rc.local.

Ставится она просто разворачиванием в директорию

text
   1. Download Bamboo Standalone for Linux. Bamboo Standalone for Linux is available for download from the Bamboo Download Center (click the 'Linux' tab).
   2. Extract the files from the Linux archive (atlassian-bamboo-x.x-standalone.tar.gz) to a Bamboo installation directory of your choice. By default, the root directory of the tar file is "Bamboo".
   3. Set up your Bamboo home directory — this is the directory where Bamboo will store its configuration data. To do this, open the file named bamboo-init.properties in the <Bamboo installation directory>/webapp/WEB-INF/classes directory. In this file, insert the property "bamboo.home", with an absolute path to your Bamboo home directory. Your file should look something like this:
      bamboo.home=/test/bamboo-home
          You must use forward-slashes in your directory path. Backslashes are not recognised by Bamboo. Please ensure that the Bamboo home directory is not located inside the Bamboo installation directory

Alternatively, you can specify an environment variable 'BAMBOO_HOME' which specifies the absolute path to your {BAMBOO_HOME} directory. Bamboo will check if an environment variable is defined.

#108196

А что за ПО, если не секрет? Все может оказаться проще на самом деле. И таки да, командную строку запуска, в том числе с параметром "от юзера" можно записать и в rc.local. Скрипт, обычно лежащий в init.d является достаточно продвинутой программой, оборабатывающий передаваемые параметры в том числе, типа start, restart, reload и тп, Вам же нужно просто запускать бинарь с определенными параметрами просто, правильно понимаю?

#108198
Denlookh написал:
А что за ПО, если не секрет? Все может оказаться проще на самом деле. И таки да, командную строку запуска, в том числе с параметром "от юзера" можно записать и в rc.local. Скрипт, обычно лежащий в init.d является достаточно продвинутой программой, оборабатывающий передаваемые параметры в том числе, типа start, restart, reload и тп, Вам же нужно просто запускать бинарь с определенными параметрами просто, правильно понимаю?

В том то и дело что пользователем хочется иметь возможность рлулить им как сервисом, именно start restart stop status. все это умеет тот самый родной стартовый скрипт.
Единственное но, что при запуске по забывчивости или незнанию с помощью sudo запуск происходит из под рута. А этого не хочется. Тоесть, юзерам хочется не париться а иметь возможность рулить состоянием процесса как обычным линукс сервисом. ( через инит скрипты как это делается для apache, qmail, rsyslog)

Войдите или зарегистрируйтесь, чтобы ответить.