从 debian:packageBin for Play 2.4.2 App 创建的 SystemD 的 .deb 没有创建日志的权限

.deb for SystemD created from debian:packageBin for Play 2.4.2 App Does Not Have Permisison to Create Log

sbt debian:packageBin 创建的 SystemD 安装脚本如何设置 webapp 写入 PID /var/run 或子目录的权限?

只有 root 有权在 /var/run 中创建 pid 文件或创建包含 pid 文件的目录,如 /var/run/myWebApp/debian:packageBin 任务导致 webapp 运行 作为一个特殊的 user:group 从 webapp 的名称创建。如果像 /var/run/myWebApp 这样创建目录,myWebApp 组需要写权限,但我看不出有什么方法可以自动实现。我错过了什么吗?

这是我的一些配置文件:

dist/conf/application.ini:

-Dpidfile.path=/var/run/webapp2/webapp2.pid

conf/application.conf:

# This seems redundant ... should it be removed?
pidfile.path = /var/run/webapp2/pid
pidfile.path = ${?pidfile.path}

debian.sbt:

import com.typesafe.sbt.packager.archetypes.ServerLoader.{Systemd, SystemV, Upstart}
import com.typesafe.sbt.SbtNativePackager.autoImport._

lazy val root = (project in file(".")).enablePlugins(PlayScala, DebianPlugin)

enablePlugins(JavaAppPackaging)
enablePlugins(JDebPackaging)
enablePlugins(JavaServerAppPackaging)

serverLoading in Debian := Systemd

maintainer in Linux      := "Mike Slinn <mslinn@mslinn.com>"
packageSummary in Linux  := "myWebApp blah blah"
packageDescription       := "myWebApp blah blah"
daemonUser in Linux      := normalizedName.value        // user which will execute the application, resolves to "myWebApp"
daemonGroup in Linux     := (daemonUser in Linux).value // group which will execute the application, resolves to "myWebApp"

更新:

Play manages its own pid.。我无法让 ${{app_name}} 展开,所以我硬编码了 myWebApp

sbt-native-packager docs 说 pid 应该放在 /var/run/myWebApp 中,日志应该放在 /var/log/myWebApp 中。

/var/run 具有权限 777 与 /run 具有权限 775 的符号链接;两者都属于 root:root。因此,非根进程可以写入 /var/run 的唯一方法是在 /var/run 下创建具有适当权限的目录。例如,postgres:postgres 有权写入 /var/run/postgres:

$ ls -adlF /var/run/postgresql
drwxrwsr-x 3 postgres postgres 120 Aug 28 01:17 /var/run/postgresql/

这就是 Play 文档显示将 pid 放入 /var/run 应该起作用的方式,但这对我不起作用。

这里是解决方案,放在debian.sbt:

linuxPackageMappings += packageTemplateMapping(s"/var/run/${name.value}/")() withUser name.value withGroup name.value

不需要 conf/application.conf 中的额外条目。