我编写了一个软件,它将充当我制作的应用程序的服务器。当我从终端运行它时,它运行完美,但当我将其作为 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 中