我使用Play 2 Framework创建了一个小应用程序,并尝试生成一个RPM包,以便从中部署到centos服务器。我已将当前版本的sbt-native-packager添加到我的plugins.sbt:
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "0.7.1")
在我的build.sbt中,我提出以下内容:
packageArchetype.java_server
packageDescription := "Custom application configuration"
maintainer in Linux := "Sönke"
packageSummary in Linux := "Ansible Callback Server"
rpmVendor in Rpm := "Sönke"
rpmLicense in Rpm := Some("BSD")
然后我运行激活器rpm:packageBin ,它生成了一个我能够安装的有效rpm包。
现在的问题是,当我直接从命令行启动程序时,一切正常,但当我执行服务启动以使其在后台运行时,它会失败。
在花了一些时间查看strace输出后,我认为问题在于以下几行:
8843 <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], WSTOPPED, NULL) = 8845
8843 socket(PF_NETLINK, SOCK_RAW, 9) = 4
8843 fcntl(4, F_SETFD, FD_CLOEXEC) = 0
8843 readlink("/proc/self/exe", "/sbin/runuser", 4096) = 13
8843 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff3df6d5d0) = -1 ENOTTY (Inappropriate ioctl for device)
8843 ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff3df6d5d0) = -1 ENOTTY (Inappropriate ioctl for device)
8843 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff3df6d5d0) = -1 ENOTTY (Inappropriate ioctl for device)
8843 sendto(4, "p\0\0\0P\4\5\0\3\0\0\0\0\0\0\0op=PAM:setcred a"..., 112, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 112
8843 poll([{fd=4, events=POLLIN}], 1, 500) = 1 ([{fd=4, revents=POLLIN}])
8843 recvfrom(4, "$\0\0\0\2\0\0\0\3\0\0\0\213\"\0\0\0\0\0\0p\0\0\0P\4\5\0\3\0\0\0"..., 8988, MSG_PEEK|MSG_DONTWAIT, {sa_family=AF_NETLINK, pid=0, groups=00000000}, [12]) = 36
8843 recvfrom(4, "$\0\0\0\2\0\0\0\3\0\0\0\213\"\0\0\0\0\0\0p\0\0\0P\4\5\0\3\0\0\0"..., 8988, MSG_DONTWAIT, {sa_family=AF_NETLINK, pid=0, groups=00000000}, [12]) = 36
8843 close(4) = 0
8843 getuid() = 0
8843 sendto(3, "<86>Jun 14 13:41:01 runuser: pam"..., 92, MSG_NOSIGNAL, NULL, 0) = 92
8843 socket(PF_NETLINK, SOCK_RAW, 9) = 4
8843 fcntl(4, F_SETFD, FD_CLOEXEC) = 0
8843 readlink("/proc/self/exe", "/sbin/runuser", 4096) = 13
8843 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff3df6d5d0) = -1 ENOTTY (Inappropriate ioctl for device)
8843 ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff3df6d5d0) = -1 ENOTTY (Inappropriate ioctl for device)
8843 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff3df6d5d0) = -1 ENOTTY (Inappropriate ioctl for device)
8843 sendto(4, "x\0\0\0R\4\5\0\4\0\0\0\0\0\0\0op=PAM:session_c"..., 120, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 120
8843 poll([{fd=4, events=POLLIN}], 1, 500) = 1 ([{fd=4, revents=POLLIN}])
8843 recvfrom(4, "$\0\0\0\2\0\0\0\4\0\0\0\213\"\0\0\0\0\0\0x\0\0\0R\4\5\0\4\0\0\0"..., 8988, MSG_PEEK|MSG_DONTWAIT, {sa_family=AF_NETLINK, pid=0, groups=00000000}, [12]) = 36
8843 recvfrom(4, "$\0\0\0\2\0\0\0\4\0\0\0\213\"\0\0\0\0\0\0x\0\0\0R\4\5\0\4\0\0\0"..., 8988, MSG_DONTWAIT, {sa_family=AF_NETLINK, pid=0, groups=00000000}, [12]) = 36
8843 close(4) = 0
从我的(有限的)理解来看,程序似乎尝试在这里做一些需要tty的东西,但是因为它在没有运行的情况下运行失败并且该过程随后退出。 我已经搜索了github问题并搜索了一下,但似乎无法找到任何相关内容,这告诉我,我在这里做错了什么,但我不知道究竟会是什么。
答案 0 :(得分:1)
显然问题是,播放应用程序创建了自己的pid文件,默认情况下是在工作目录中,这会产生问题。
解决方案是取消注释/ etc / default / {progname}
中的以下行-Dpidfile.path=/var/run/provisionist/play.pid
我觉得我太傻了。