Мне было интересно, что является хорошей практикой для создания хорошего скрипта для запуска / остановки / перезапуска какой-либо службы. Я постараюсь пояснить, хорошо? Сейчас я делаю что-то вроде этого: скажем, я хотел бы создать скрипт для start/stop/restart
сервис, поэтому я создаю папку /company/service name/
и там положил start.sh
и stop.sh
, которые выглядят примерно так:
start.sh
#!/bin/bash
#VARIABLES
SERVICE_NAME="<service name>"
USERDEPLOYER="<service name>_deployer"
FOLDER=/company/<service name>/
KEYWORD="<keyword>"
#
#CHECKING SYSTEM STATUS
PROC=`ps -ef | grep $SERVICE_NAME | grep $KEYWORD | grep -v grep | awk -F" " '{ print $2 }'`;
if [ $PROC ]; then
echo "$SERVICE_NAME is running!"
echo "Stop then first!"
exit
fi
###
#
#STARTING
if [[ `/usr/bin/whoami` == $USERDEPLOYER ]]
then
pushd .
echo " "
echo "Starting $SERVICE_NAME..."
echo "cd $FOLDER"
cd $FOLDER
#COMMAND
<command to start the service> &
sleep 20
PROC=`ps -ef | grep $SERVICE_NAME | grep $KEYWORD | grep -v grep | awk -F" " '{ print $2 }'`;
if [ -n "$PROC" ] && [ "$PROC" != "" ]
then
echo "OK: system started."
else
echo "ERROR: system process not found!"
fi
echo "script execution finished!"
popd
else
echo "User must be $USERDEPLOYER !"
fi
stop.sh
#!/bin/bash
#VARIABLES
SERVICE_NAME="<service name>"
USERDEPLOYER="<service name>_deployer"
KEYWORD="python"
if [[ `/usr/bin/whoami` == $USERDEPLOYER ]]
then
pushd .
echo "Stopping $SERVICE_NAME......"
#KILLING PROCESS
processPID=`ps -ef | grep $SERVICE_NAME | grep $KEYWORD | grep -v grep | awk -F" " '{ print $2 }'`
echo "Trying to kill process with key $SERVICE_NAME - ignore error messages below."
kill $processPID
sleep 10
while [ -n "$processPID" ]
do
echo "Waiting process ($processPID) to shutdown...20s"
sleep 20
processPID=`ps -ef | grep $SERVICE_NAME | grep $KEYWORD | grep -v grep | awk -F" " '{ print $2 }'`
done
echo "Ensured process with key $SERVICE_NAME is no longer running."
popd
else
echo "User must be $USERDEPLOYER !"
fi
После этого создаю пользователя service name_deployer
, чем передать право собственности на эту папку и эти скрипты, start.sh
и stop.sh
, давая разрешение read, write and execute
также.
Затем создайте следующий скрипт в /etc/init.d/
так как service name-service
:
#!/bin/bash
#
# Linux chkconfig stuff:
#
# chkconfig: 2345 56 10
# 2345 56
# 2345 10
# description: <description>
# Source function library.
SERVICE_NAME="<service name>-service"
SERVICE_USER="<service name>_deployer"
FOLDER="/company/<service name>/"
start() {
if [[ `/usr/bin/whoami` == $SERVICE_USER ]]
then
cd $FOLDER
./start.sh
#NOT USER _root
else
cd $FOLDER
su $SERVICE_USER ./start.sh
fi
}
stop() {
cd $FOLDER
su $SERVICE_USER ./stop.sh
}
#Body main
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
echo "Restarting $SERVICE_NAME..."
echo " "
stop
sleep 10
start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
Учитывая право собственности на service name_deployer
и разрешение на read, write and execute.
Затем добавьте сервис в список сервисов следующим образом: / sbin / chkconfig --add service name-service
(suse и другие) или update-rc.d service name-service
значения по умолчанию (ubuntu)
И это все! Вы, ребята, думали, что это хороший подход? Я просто спрашиваю, потому что хотел бы создать хороший стандарт для такого рода скриптов и процедур. Извините, если вы думаете, что это неубедительный вопрос, но для меня очень важна такая процедура.
Спасибо вам, ребята!
Скорее использовать судо для управления доступом пользователей. Создать сценарий в /etc/init.d/
следуя обычным соглашениям. (Скрипты для Ubuntu / Debian должны использовать start-stop-daemon
для запуска, остановки с повторными попытками и проверки состояний процесса.) Затем запустите visudo
и добавьте соответствующие записи, чтобы пользователи могли управлять этой службой. Например:
User_Alias SERVICE_USERS = bob, jane
Cmnd_Alias SERVICE_CMNDS = service service-name
SERVICE_USERS ALL = SERVICE_CMNDS
Затем указанные пользователи могут запускать sudo service service-name start
и так далее.
Я думаю, что вы создаете много ненужных сложностей, посмотрите членство в группах и файл / etc / sudoers. С помощью этих инструментов вы можете давать очень конкретные разрешения службам и файлам в системе. Его легче администрировать, он переживет обновления и позволит вам добавлять и удалять пользователей гораздо более централизованным, но детализированным образом.
Ник