Как конвертировать скрипт init Ubuntu в сценарий инициализации Amazon Linux AMI?

У меня был сервер Amazon EC2, основанный на Ubuntu, на котором я запускал приложение на основе Java. Для этого я написал сценарий инициализации, который работал отлично и следующим образом

#! /bin/sh # set the environment variables that are used PATH=/sbin:/usr/sbin:/bin:/usr/bin JAVA_HOME=/usr/lib/jvm/java-6-sun/jre JAVA=$JAVA_HOME/bin/java DESC="My Application" NAME="myserver" DAEMON=$JAVA DAEMON_HOME="/home/ganesh/MyServer/" JAR=$DAEMON_HOME/MyServer.jar DAEMON_ARGS="-Xms512m -Xmx4112m -jar $JAR" PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/myserver #the user that will run the script USER=ganesh # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. . /lib/lsb/init-functions # # Function that starts the daemon/service # do_start() { start-stop-daemon -N -10 -b --start -d $DAEMON_HOME --quiet --chuid $USER -m -p $PIDFILE --exec $DAEMON -- $DAEMON_ARGS \ || return 2 #Test to see if the engine has started start-stop-daemon -b --test --start -d $DAEMON_HOME --quiet --chuid $USER -m -p $PIDFILE --exec $DAEMON -- $DAEMON_ARGS >/dev/null 2>&1 case "$?" in 0) echo "[ FAIL ] App Engine has not started";; 1) echo "[ OK ] App Engine has started";; esac } # # Function that stops the daemon/service # do_stop() { start-stop-daemon --stop --retry 120 --oknodo --pidfile $PIDFILE RETVAL="$?" rm -f $PIDFILE return "$RETVAL" } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" echo "Starting $DESC" "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 echo "[ FAIL ]";; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" echo "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac echo "[ OK ]" ;; restart) # # If the "reload" option is implemented then remove the # 'force-reload' alias # log_daemon_msg "Restarting $DESC" "$NAME" echo "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2 exit 3 ;; esac : 

Теперь я переместил мой сервер с Ubuntu на Amazon Linux AMI. Поэтому я изменил выше сценарий инициализации следующим образом

 #!/bin/bash # Source function library. . /etc/init.d/functions RETVAL=0 prog="myserver" LOCKFILE=/var/lock/subsys/$prog PIDFILE=/var/run/$prog.pid PATH=/sbin:/usr/sbin:/bin:/usr/bin JAVA=/usr/bin/java DESC="MY Application" DAEMON=$JAVA DAEMON_HOME="/home/ganesh/MyServer" JAR=$DAEMON_HOME/MyServer.jar DAEMON_ARGS="-Xms512m -Xmx4112m -jar $JAR" PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/myserver #the user that will run the script USER=root echo "All value sets" start() { echo "IN start" echo -n "Starting $prog: " daemon --user $USER --chdir $DAEMON_HOME --pidfile $PIDFILE $DAEMON -- $DAEMON_ARGS RETVAL=$? [ $RETVAL -eq 0 ] && touch $LOCKFILE echo return $RETVAL } stop() { echo -n "Shutting down $prog: " killproc --pidfile RETVAL=$? [ $RETVAL -eq 0 ] && rm -f $LOCKFILE echo return $RETVAL } status() { echo -n "Checking $prog status: " RETVAL=$? return $RETVAL } case "$1" in start) start ;; stop) stop ;; status) status ;; restart) stop start ;; *) echo "Usage1: $prog {start|stop|status|restart}" exit 1 ;; esac exit $RETVAL и #!/bin/bash # Source function library. . /etc/init.d/functions RETVAL=0 prog="myserver" LOCKFILE=/var/lock/subsys/$prog PIDFILE=/var/run/$prog.pid PATH=/sbin:/usr/sbin:/bin:/usr/bin JAVA=/usr/bin/java DESC="MY Application" DAEMON=$JAVA DAEMON_HOME="/home/ganesh/MyServer" JAR=$DAEMON_HOME/MyServer.jar DAEMON_ARGS="-Xms512m -Xmx4112m -jar $JAR" PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/myserver #the user that will run the script USER=root echo "All value sets" start() { echo "IN start" echo -n "Starting $prog: " daemon --user $USER --chdir $DAEMON_HOME --pidfile $PIDFILE $DAEMON -- $DAEMON_ARGS RETVAL=$? [ $RETVAL -eq 0 ] && touch $LOCKFILE echo return $RETVAL } stop() { echo -n "Shutting down $prog: " killproc --pidfile RETVAL=$? [ $RETVAL -eq 0 ] && rm -f $LOCKFILE echo return $RETVAL } status() { echo -n "Checking $prog status: " RETVAL=$? return $RETVAL } case "$1" in start) start ;; stop) stop ;; status) status ;; restart) stop start ;; *) echo "Usage1: $prog {start|stop|status|restart}" exit 1 ;; esac exit $RETVAL 

У меня возникли проблемы с заменой следующих основных линий в функциях запуска и останова

 start-stop-daemon -N -10 -b --start -d $DAEMON_HOME --quiet --chuid $USER -m -p $PIDFILE --exec $DAEMON -- $DAEMON_ARGS \ || return 2 

а также

 start-stop-daemon --stop --retry 120 --oknodo --pidfile $PIDFILE 

Amazon Linux заменяет «start-stop-daemon» на «daemon» и с помощью man-страницы я изменил выше строки следующим образом

 daemon --user $USER --chdir $DAEMON_HOME --pidfile $PIDFILE $DAEMON -- $DAEMON_ARGS 

а также

 killproc --pidfile 

Но он дает следующую ошибку.

Запуск myserver: ./myserver: Использование: daemon [+/- nicelevel] {program}

Кто-нибудь поможет мне написать правильный сценарий инициализации Amazon Linux AMI?

РЕДАКТИРОВАТЬ:

В функции запуска я выполнил следующие изменения, и теперь этот скрипт запускает демона, но не создает pidfile и, следовательно, он не может остановить демона

 cd $DAEMON_HOME daemon --user $USER --pidfile $PIDFILE $DAEMON $DAEMON_ARGS >/dev/null 2>&1 & 

Так может ли кто-нибудь предложить мне о том, что в нем не так, и что мне нужно сделать, чтобы создать файл pid auomatically?

2 Solutions collect form web for “Как конвертировать скрипт init Ubuntu в сценарий инициализации Amazon Linux AMI?”

Я обновил свой сценарий до следующего кода. Хотя он не может создать pidfile, но он работает, как я хочу. Если у кого-то есть лучший сценарий, то любезно отправьте свой ответ.

 #!/bin/bash # chkconfig: 2345 95 05 # description: MY Application # Source function library. . /etc/init.d/functions RETVAL=0 prog="myserver" PIDFILE=/var/run/$prog.pid LOCKFILE=/var/lock/subsys/$prog PATH=/sbin:/usr/sbin:/bin:/usr/bin JAVA=/usr/bin/java DESC="MY Application" DAEMON=$JAVA DAEMON_HOME="/home/ganesh/MyServer/" JAR=$DAEMON_HOME/MyServer.jar DAEMON_ARGS="-Xms512m -Xmx4112m -jar $JAR" SCRIPTNAME=/etc/init.d/myserver #the user that will run the script USER=root #echo "All value sets" start() { if [ -f $LOCKFILE ]; then echo "$DESC is already running. Exiting." exit 1 else echo -n "Starting $prog:" cd $DAEMON_HOME daemon --user $USER --pidfile $PIDFILE $DAEMON $DAEMON_ARGS >/dev/null 2>&1 & RETVAL=$? echo [ $RETVAL -eq 0 ] && touch $LOCKFILE fi return $RETVAL } stop() { echo -n "Shutting down "$prog: kill -9 `ps -ef | grep "$JAR" | grep -v grep | awk '{ print $2 }'` RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f $LOCKFILE return $RETVAL } check_status() { #echo -n "Checking $prog status: " status $prog RETVAL=$? return $RETVAL } case "$1" in start) start ;; stop) stop ;; status) check_status ;; restart) stop start ;; *) echo "Usage: $prog {start|stop|status|restart}" exit 1 ;; esac exit $RETVAL и #!/bin/bash # chkconfig: 2345 95 05 # description: MY Application # Source function library. . /etc/init.d/functions RETVAL=0 prog="myserver" PIDFILE=/var/run/$prog.pid LOCKFILE=/var/lock/subsys/$prog PATH=/sbin:/usr/sbin:/bin:/usr/bin JAVA=/usr/bin/java DESC="MY Application" DAEMON=$JAVA DAEMON_HOME="/home/ganesh/MyServer/" JAR=$DAEMON_HOME/MyServer.jar DAEMON_ARGS="-Xms512m -Xmx4112m -jar $JAR" SCRIPTNAME=/etc/init.d/myserver #the user that will run the script USER=root #echo "All value sets" start() { if [ -f $LOCKFILE ]; then echo "$DESC is already running. Exiting." exit 1 else echo -n "Starting $prog:" cd $DAEMON_HOME daemon --user $USER --pidfile $PIDFILE $DAEMON $DAEMON_ARGS >/dev/null 2>&1 & RETVAL=$? echo [ $RETVAL -eq 0 ] && touch $LOCKFILE fi return $RETVAL } stop() { echo -n "Shutting down "$prog: kill -9 `ps -ef | grep "$JAR" | grep -v grep | awk '{ print $2 }'` RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f $LOCKFILE return $RETVAL } check_status() { #echo -n "Checking $prog status: " status $prog RETVAL=$? return $RETVAL } case "$1" in start) start ;; stop) stop ;; status) check_status ;; restart) stop start ;; *) echo "Usage: $prog {start|stop|status|restart}" exit 1 ;; esac exit $RETVAL 

РЕДАКТИРОВАТЬ:

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

 #!/bin/bash # chkconfig: 2345 95 05 # description: MY Application # Source function library. . /etc/init.d/functions RETVAL=0 prog="myserver" PIDFILE=/var/run/$prog.pid LOCKFILE=/var/lock/subsys/$prog PATH=/sbin:/usr/sbin:/bin:/usr/bin JAVA=/usr/bin/java DESC="MY Application" DAEMON=$JAVA DAEMON_HOME="/home/ganesh/MyServer/" JAR=$DAEMON_HOME/MyServer.jar DAEMON_ARGS="-Xms512m -Xmx4112m -jar $JAR" SCRIPTNAME=/etc/init.d/myserver #the user that will run the script USER=root #echo "All value sets" start() { if [ -f $PIDFILE ]; then PID=`cat $PIDFILE` if [ -z "`pgrep $PID`" ] && [ "$PID" != "`ps aux|grep -vE 'grep|runuser|bash'|grep -w "$JAR"|awk '{print $2}'`" ]; then printf "%s\n" "Process dead but pidfile exists" else printf "$prog is already running!\n" fi else printf "%-50s" "Starting $prog ..." cd $DAEMON_HOME daemon --user $USER $DAEMON $DAEMON_ARGS >/dev/null 2>&1 & sleep 5 PID=`ps aux|grep -vE 'grep|runuser|bash'|grep -w "$JAR"|awk '{print $2}'` if [ -z "$PID" ]; then printf "[ \e[31mFAIL\033[0m ]\n" else echo $PID > $PIDFILE printf "[ \e[32mOK\033[0m ]\n" fi fi } stop() { printf "%-50s" "Shutting down $prog:" if [ -f $PIDFILE ]; then PID=`cat $PIDFILE` kill -HUP $PID 2>/dev/null printf "[ \e[32mOK\033[0m ]\n" rm -f $PIDFILE else printf "[ \e[31mFAIL\033[0m ]\n" fi } check_status() { printf "%-50s" "Checking $prog ..." if [ -f $PIDFILE ]; then PID=`cat $PIDFILE` if [ -z "`pgrep $PID`" ] && [ "$PID" != "`ps aux|grep -vE 'grep|runuser|bash'|grep -w "$JAR"|awk '{print $2}'`" ]; then printf "%s\n" "Process dead but pidfile exists" else printf "[ \e[32mRUNNING\033[0m ]\n" fi else printf "[ \e[31mSTOPPED\033[0m ]\n" fi } case "$1" in start) start ;; stop) stop ;; status) check_status ;; restart) stop start ;; *) echo "Usage: $prog {start|stop|status|restart}" exit 1 ;; esac exit 1 и #!/bin/bash # chkconfig: 2345 95 05 # description: MY Application # Source function library. . /etc/init.d/functions RETVAL=0 prog="myserver" PIDFILE=/var/run/$prog.pid LOCKFILE=/var/lock/subsys/$prog PATH=/sbin:/usr/sbin:/bin:/usr/bin JAVA=/usr/bin/java DESC="MY Application" DAEMON=$JAVA DAEMON_HOME="/home/ganesh/MyServer/" JAR=$DAEMON_HOME/MyServer.jar DAEMON_ARGS="-Xms512m -Xmx4112m -jar $JAR" SCRIPTNAME=/etc/init.d/myserver #the user that will run the script USER=root #echo "All value sets" start() { if [ -f $PIDFILE ]; then PID=`cat $PIDFILE` if [ -z "`pgrep $PID`" ] && [ "$PID" != "`ps aux|grep -vE 'grep|runuser|bash'|grep -w "$JAR"|awk '{print $2}'`" ]; then printf "%s\n" "Process dead but pidfile exists" else printf "$prog is already running!\n" fi else printf "%-50s" "Starting $prog ..." cd $DAEMON_HOME daemon --user $USER $DAEMON $DAEMON_ARGS >/dev/null 2>&1 & sleep 5 PID=`ps aux|grep -vE 'grep|runuser|bash'|grep -w "$JAR"|awk '{print $2}'` if [ -z "$PID" ]; then printf "[ \e[31mFAIL\033[0m ]\n" else echo $PID > $PIDFILE printf "[ \e[32mOK\033[0m ]\n" fi fi } stop() { printf "%-50s" "Shutting down $prog:" if [ -f $PIDFILE ]; then PID=`cat $PIDFILE` kill -HUP $PID 2>/dev/null printf "[ \e[32mOK\033[0m ]\n" rm -f $PIDFILE else printf "[ \e[31mFAIL\033[0m ]\n" fi } check_status() { printf "%-50s" "Checking $prog ..." if [ -f $PIDFILE ]; then PID=`cat $PIDFILE` if [ -z "`pgrep $PID`" ] && [ "$PID" != "`ps aux|grep -vE 'grep|runuser|bash'|grep -w "$JAR"|awk '{print $2}'`" ]; then printf "%s\n" "Process dead but pidfile exists" else printf "[ \e[32mRUNNING\033[0m ]\n" fi else printf "[ \e[31mSTOPPED\033[0m ]\n" fi } case "$1" in start) start ;; stop) stop ;; status) check_status ;; restart) stop start ;; *) echo "Usage: $prog {start|stop|status|restart}" exit 1 ;; esac exit 1 

Вместо того, чтобы переписывать скрипт, я решил установить rpm для start-stop-daemon .

 # Follow instructions here to make the RPM available to yum # https://packagecloud.io/willgarcia/start-stop-daemon/install # and then you can run: yum install start-stop-daemon 

Источник можно найти здесь: https://github.com/willgarcia/start-stop-daemon

  • mdadm RAID10 - изменение сломанного диска
  • java.lang.UnsatisfiedLinkError: libawt_xawt.so: libXi.so.6: невозможно открыть файл общих объектов: нет такого файла или каталога
  • Могу ли я использовать и устанавливать пакеты Ubuntu в Debian?
  • Почему я не могу отправлять сообщения с помощью команды на стене?
  • Пользовательские настройки для monit? Должна ли она выполняться как root или ее собственный пользователь?
  • ethtool с виртуальным сетевым адаптером ничего не показывает - распечатать текущие настройки сетевого адаптера в OpenStack VM
  • Проблемы с перемещением домашнего раздела
  • Как установить AMD Catalyst 15.9 на Ubuntu 15.10?
  • Настройка беспроводной сети из командной строки
  • Сетевой интерфейс, не регистрирующий ответ ARP
  • nsswitch.conf против host.conf
  • Linux и Unix - лучшая ОС в мире.