Привет всем,
У меня есть управляющий скрипт который позволяет запустить, остановить или перезагрузить программку
# /opt/someprog/startup_script start
И сервис стартует от имени пользователя который его запустил.
НО например мы выделили специального пользователя dude для этого, задача в том чтобы зарегистрировать такой скрипт в сервисах линукс, и запускать его (и это САМОЕ ВАЖНОЕ) от нужного пользователя. Шаблон файла сервисов я нашел, но вот как сделать так, чтобы скрипт в любом случае (по sudo, при загрузке т.д.) запускался от пользователя dude.
У апача например этот параметр есть в конфиге.
Хелп плз! smile
Запуск скрипта как сервиса (/etc/init.d)
[console]man su[/console]
Хм... Ну man su это здорово, а чуть подробнее?
Сделать в начале инит скрипта переход к нужному юзеру, а в конце возврат обратно? Я на самом деле примерно так и думал.
только как это реализовать чтоб "по феншую", а не колхозно-костыльный вариант.
Пример посмотреть можно? :rolleyes:
Сделать в начале инит скрипта переход к нужному юзеру,так команда su это и делает...
[console]
su <user name> -c <command>
[/console]
Что делает su я знаю,
И как уже и говорил, это первое о чем я подумал, вопрос в том, правильно ли и по стандартам применить su в инит скрипте для решения такой задачи, или правильнее будет сделать это по другому, хотя думаю что Ваш ответ убедил меня.
Хотя странно что в других инит скриптах запускающихся от юзеров специально для этого выделенных я не вижу использования su ... :o
ufomen, в других скриптах, возможно, запускаются сервисы, позволяющие указать пользователя в опциях. Что вы хотите запустить своим скриптом?
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 не стартует автоматически.
Есть еще несколько подобных программок которые хотелось бы зарегистрировать как сервисы и не париться. Но хочется сделать это ПРАВИЛЬНО.
Конфига с параметром пользователя увы нет... запускается от имени запустившего.
./bamboo.sh
Если не секрет, покажите полностью этот скрипт.
[quote=ufomen]./bamboo.sh
Если не секрет, покажите полностью этот скрипт.[/quote]
Сейчас уже дома, завтра выложу.
Не думаю что правильно будет менять что-то в этом скрипте, скорее нужно создать свой инит, либо с использованием su либо еще как-то. Поэтому хочется услышать варианты ;)
Конечно очень хотелось бы найти пример где это уже решалось правильно и по стандартам. wink
Не думаю что правильно будет менять что-то в этом скрипте
Данный скрипт — просто «обёртка» для какой-то команды, вот я бы и хотел посмотреть, что это за команда, ну и опции её запуска «погуглить».
[quote=ufomen]Не думаю что правильно будет менять что-то в этом скрипте
Данный скрипт — просто «обёртка» для какой-то команды, вот я бы и хотел посмотреть, что это за команда, ну и опции её запуска «погуглить».[/quote]
Качнул версию 2.6.1 отсюда http://www.atlassian.com/software/bamboo/ArchiveBambooDownloads.jspa
Собственно выкладываю сам скрипт.
#!/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
ufomen, сейчас уже сооброжаю плохо, но во многих скриптах, если их посмотреть поподробнее, то можно увидеть дефолтные параметры запуска а-ля -u username --defaults=/path/to/file.conf и тп. В Вашем случае такое не канает? Простенький скрипт запуска можно написать самому, исходя из этого.
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 /"
ufomen, а в документации к программе нигде нет описания опций, с которыми она может запускаться?
В конце концов, можно чуть изменить скрипт, добавив к команде запуска su ...
ufomen, а в документации к программе нигде нет описания опций, с которыми она может запускаться?
В конце концов, можно чуть изменить скрипт, добавив к команде запуска su ...
Можно и изменить, но...
При апдейте скрипт скорее всего перезапишется, это раз. Как вариант создать инит с su который в свою очередь будет запускать этот скрипт от имени нужного пользователя.
Хотя теперь уже и не знаю, интересно почему изначально это было не реализовано как сервис с инит скриптом?...
ufomen, а, кстати, как именно вы устанавливали программу? Посредством менеджера управления пакетами либо вручную? И почему созданный вами скрипт должен перезаписаться? Чуть изменить имя — и всё! Да и чтоб совсем всё было по «феншую», поместите его куда-либо, в зависимости от вашего дистрибутива, в /etc/init.d/rc.local.
ufomen, а, кстати, как именно вы устанавливали программу? Посредством менеджера управления пакетами либо вручную? И почему созданный вами скрипт должен перезаписаться? Чуть изменить имя — и всё! Да и чтоб совсем всё было по «феншую», поместите его куда-либо, в зависимости от вашего дистрибутива, в /etc/init.d/rc.local.
Ставится она просто разворачиванием в директорию
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.
А что за ПО, если не секрет? Все может оказаться проще на самом деле. И таки да, командную строку запуска, в том числе с параметром "от юзера" можно записать и в rc.local. Скрипт, обычно лежащий в init.d является достаточно продвинутой программой, оборабатывающий передаваемые параметры в том числе, типа start, restart, reload и тп, Вам же нужно просто запускать бинарь с определенными параметрами просто, правильно понимаю?
А что за ПО, если не секрет? Все может оказаться проще на самом деле. И таки да, командную строку запуска, в том числе с параметром "от юзера" можно записать и в rc.local. Скрипт, обычно лежащий в init.d является достаточно продвинутой программой, оборабатывающий передаваемые параметры в том числе, типа start, restart, reload и тп, Вам же нужно просто запускать бинарь с определенными параметрами просто, правильно понимаю?
В том то и дело что пользователем хочется иметь возможность рлулить им как сервисом, именно start restart stop status. все это умеет тот самый родной стартовый скрипт.
Единственное но, что при запуске по забывчивости или незнанию с помощью sudo запуск происходит из под рута. А этого не хочется. Тоесть, юзерам хочется не париться а иметь возможность рулить состоянием процесса как обычным линукс сервисом. ( через инит скрипты как это делается для apache, qmail, rsyslog)