我对编写单元文件的过程很满意,但我不知道如何布局ExecStart的内容(以及其他相关内容)。
我得到了一个播放应用程序的命令行,它只声明:
cd /play_home_dir
activator run
有人能帮我把这些命令放在一个单元文件里吗?或者解释如何最好地使用单元文件执行上述任务?
您需要首先创建一个分发:例如,sbt-universal:package zip tarball。创建应用程序的二进制分发。
在系统方面:
[Unit]
Description=service1
After=multi-user.target
[Service]
Type=simple
ExecStartPre=/bin/rm -f /usr/local/play/service1/RUNNING_PID
ExecStart=/usr/local/play/service1/bin/service1 -J-Xmx5120m -J-Xms3072m -J-server -Dlogger.file=/usr/local/play/service1/conf/application-live.xml -Dconfig.file=/usr/local/play/service1/conf/application-live.conf
User=play
Group=play
TimeoutStopSec=10
LimitNOFILE=10240
[Install]
WantedBy=multi-user.target
假设:
该应用程序名为service1,记录器配置在application-live.xml中,应用程序配置在application-live.conf中
我在生产中使用以下注释的系统单元文件。将{{app_name}}替换为播放项目的名称。{{app_version.stdout}}是build.sbt中指定的项目版本我正在呼叫play dist
并在/opt
中上传zip。
[Unit]
Description=The {{ app_name }}
After=network.target
After=postgresql.service
[Service]
# Source environment for application
EnvironmentFile=/home/{{ app_name }}/app.env
EnvironmentFile=/home/{{ app_name }}/{{ env }}.env
# Up Evolutions should be safe on Production
# Down Evolutions are to be avoided
ExecStart=/opt/{{ app_name }}-{{ app_version.stdout }}/bin/{{ app_name }}
-Dhttp.address=localhost
-DapplyEvolutions.default=true
-Dpidfile.path=/var/run/{{ app_name }}/{{ app_name }}.pid
User={{ app_name }}
Group={{ app_name }}
WorkingDirectory=/opt/{{ app_name }}-{{ app_version.stdout }}
# Ensure /var/run/ {{ app_name }} is created before creating the pidfile
RuntimeDirectory={{ app_name }}
# See http://serverfault.com/a/695863
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
我注意到,在硬断电后,播放启动失败,因为postgresql还不可用,因此After=postgresql.service
我选择将我的应用程序配置放在环境变量中,遵循https://12factor.net/config,所以我正在用EnvironmentFile
指令寻找这些。