软件通过终端手动运行时可以运行,但不能作为 Upstart 服务运行

软件通过终端手动运行时可以运行,但不能作为 Upstart 服务运行

我编写了一个软件,它将充当我制作的应用程序的服务器。当我从终端运行它时,它运行完美,但当我将其作为 Upstart 服务运行时,每次执行非常具体的操作时它都会崩溃。我认为它在读取文件时会崩溃,但使用 Haskell 很难知道。

这是我在终端中运行它的方式(当它工作时):

cd /srv/MyApp/
sudo -u appServerUser -g appServerUser ./appServer

这是我的 Upstart .conf(放在 /etc/init/)(崩溃):

start on runlevel [2345]
stop on runlevel [^2345]

chdir /srv/MyApp/
setuid appServerUser
setgid appServerUser

respawn limit 5 5

exec ./appServer

我是否错误地配置了 Upstart?或者,为什么程序的行为不同,尽管它应该具有完全相同的权限并从同一位置运行。

我意识到我对程序崩溃的判断有点错误。程序没有崩溃,但线程崩溃了。

找到源头:经过大量压缩后,我意识到它在尝试读取非 ASCII 字符时会崩溃。为什么它只在以 Upstart 运行时失败,我不明白,但我发现了问题所在,我认为这是编译器或 Upstart 中的一个错误。

答案1

前段时间 chdir 和 upstart 出现了一些问题。一般来说,upstart 会对进程做一些奇怪的事情,导致 ./application 不是从 chdir 设置的目录中执行的(如果我没记错的话)。

尝试exec /srv/MyApp/appServer不使用 chdir 或exec 'cd /srv/MyApp/; ./appServer'(这里的工作目录的范围会有差异,但这在您的示例中并不重要)

答案2

好的,我找到问题了。为什么这么复杂的问题总是有这么简单的答案。我需要输入:

env LAN=en_US.UTF-8

在 .conf 中

相关内容