如何设置将在aws ec2 ubuntu 16.04实例上运行jar文件的服务

时间:2018-07-13 08:15:47

标签: linux bash amazon-web-services ubuntu

我希望您能帮助我解决尝试设置将在aws ec2 ubuntu 16.04实例上运行jar文件的服务时遇到的问题。 这是我在运行systemctl status demo.service后得到的输出

  

●demo.service-演示   已加载:已加载(/etc/systemd/system/demo.service;已启用;供应商预设:已启用)

     

有效:自2018年7月13日星期五以来一直无效(已死)IDT; 14s前   进程:1077 ExecStop = / usr / local / bin / demo.sh停止(代码=已退出,状态= 0 /成功)

     

进程:1063 ExecStart = / usr / local / bin / demo.sh开始(代码=已退出,状态= 0 /成功)

     

7月13日10:38:19 ip-172-31-38-145 systemd [1]:正在启动演示...

     

Jul 13 10:38:19 ip-172-31-38-145 demo.sh [1063]:正在启动演示...

     

7月13日10:38:19 ip-172-31-38-145 demo.sh [1063]:演示已开始...

     

Jul 13 10:38:19 ip-172-31-38-145 demo.sh [1077]:演示正在停止...

     

7月13日10:38:19 ip-172-31-38-145 demo.sh [1077]:/usr/local/bin/demo.sh:20:杀死:没有这样的过程

     

Jul 13 10:38:19 ip-172-31-38-145 demo.sh [1077]:演示已停止...

     

7月13日10:38:19 ip-172-31-38-145 systemd [1]:开始演示。

因为我正在运行一个侦听端口443的spring boot应用程序,所以我必须将它作为sudo运行,并且当在nohup命令之前添加sudo时,我会得到这个..

  

●demo.service-演示   已加载:已加载(/etc/systemd/system/demo.service;已启用;供应商预设:已启用)

     

有效:自2018年7月13日星期五以来无效(已死) 3秒前   进程:1439 ExecStop = / usr / local / bin / demo.sh停止(代码=已退出,状态= 0 /成功)

     

进程:1433 ExecStart = / usr / local / bin / demo.sh开始(代码=已退出,状态= 0 /成功)

     

7月13日10:53:33 ip-172-31-38-145 systemd [1]:正在启动演示...

     

Jul 13 10:53:33 ip-172-31-38-145 demo.sh [1433]:正在启动演示...

     

7月13日10:53:33 ip-172-31-38-145 demo.sh [1433]:演示已开始...

     

Jul 13 10:53:33 ip-172-31-38-145 sudo [1434]:root:TTY = unknown; PWD = /; USER = root; COMMAND = / usr / bin / nohup java -jar /demo.jar / tmp

     

7月13日10:53:33 ip-172-31-38-145 sudo [1434]:pam_unix(sudo:session):用户(uid = 0)为root用户打开了会话

     

7月13日10:53:33 ip-172-31-38-145 sudo [1434]:pam_unix(sudo:session):用户root会话已关闭

     

7月13日10:53:33 ip-172-31-38-145 demo.sh [1439]:演示正在停止...

     

7月13日10:53:33 ip-172-31-38-145 demo.sh [1439]:/usr/local/bin/demo.sh:20:杀死:没有这样的过程

     

Jul 13 10:53:33 ip-172-31-38-145 demo.sh [1439]:演示已停止...

     

7月13日10:53:33 ip-172-31-38-145 systemd [1]:开始演示。

我的文件/usr/local/bin/demo.sh

#!/bin/sh
SERVICE_NAME=demo
PATH_TO_JAR=/demo.jar
PID_PATH_NAME=/tmp/demo-pid
case $1 in
    start)
        echo "Starting $SERVICE_NAME ..."
        if [ ! -f $PID_PATH_NAME ]; then
            sudo nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
                        echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is already running ..."
        fi
    ;;
    stop)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stoping ..."
            kill $PID;
            echo "$SERVICE_NAME stopped ..."
            rm $PID_PATH_NAME
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
    restart)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stopping ...";
            kill $PID;
            echo "$SERVICE_NAME stopped ...";
            rm $PID_PATH_NAME
            echo "$SERVICE_NAME starting ..."
            sudo  nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
                        echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
esac

和我在/etc/systemd/system/demo.service中具有执行权限的文件

[Unit]
Description=demo
After=syslog.target

[Service]
Type = forking
ExecStart = /usr/local/bin/demo.sh start
ExecStop = /usr/local/bin/demo.sh stop
ExecReload = /usr/local/bin/demo.sh reload


[Install]
WantedBy=multi-user.target

请咨询.. :)

2 个答案:

答案 0 :(得分:2)

因此,我试图在作为服务的AWS EC2实例上运行Spring Boot应用程序,发现一些漂亮的小袋子阻止了我实现自己的目标..

  1. 始终使用absolute directory

  2. 在spring boot application中写入您的密钥库目录(正在使用不同的服务)。即使keystore.p12文件位于项目中,该属性文件也指向即时目录而不是您的项目。 p>

  

server.port = 443

     

server.ssl.key-store = / home / ubuntu / keystore.p12

     

server.ssl.key-store-password = changeme

     

server.ssl.keyStoreType = PKCS12

     

server.ssl.keyAlias = tomcat

3。保持服务单元文件(/etc/systemd/system/demo.service)干净简单,并在此处使用绝对路径。

a great how to with a simple explanation

[Unit]
Description=demo
After=syslog.target

[Service]
ExecStart = /home/ubuntu/scripts/demo.sh

[Install]
WantedBy=multi-user.target
  1. 保持您的bash /脚本文件(/scripts/demo.sh)干净,简单,无需将命令作为nohup运行即可使其在后台运行。
#!/bin/bash
sudo java -jar /home/ubuntu/demo.jar

我还发现,一旦您尝试运行加密的连接,一旦弹簧启动大叫,与该端口有关的错误就不会真正成立。在我的情况下,它不仅连接到密钥库文件及其位置,而且不仅仅在这种情况下。

享受..

答案 1 :(得分:0)

您可以在ubuntu ec2实例中使用rc.local在启动时启动应用程序(.jar)。只需在exit 0行之前在rc.local中包含.jar可执行执行代码,如下所示,要修改rc.local,您应该具有root用户访问权限。因此,请按以下方式访问它,  sudo vi /etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Example Code Execution

java -jar sampleExecutionPackage.jar 

exit 0

之后,如果您需要检查正在运行的应用程序的状态,则可以检查是否使用

sudo systemctl status rc-local.service

您可以使用start/stop/restart代替status进行相应的使用。