如何将 weechat 和 screen 作为 upstart 服务运行且不会出现错误?

如何将 weechat 和 screen 作为 upstart 服务运行且不会出现错误?

我想在后台持续运行 weechat,以便我可以通过屏幕 ssh 进入并重新连接到它。

我正尝试通过以下文件来实现这一点/etc/init/chatscreen.conf

description     "Run a persistent weechat within a screen"

start on runlevel [2345]

respawn

setuid chat
setgid chat

exec /usr/bin/screen -S chatscreen -Dm /usr/bin/weechat

然后我运行sudo initctl start chatscreen启动该服务,并打印chatscreen start/running, process 3090

当我sudo initctl status chatscreen稍后运行时,它会打印chatscreen stop/waiting,并且根据 htop,没有屏幕或 weechat 进程正在运行。

dmesg 显示以下错误:

[ 5649.430032] init: chatscreen main process ended, respawning
[ 5649.454638] init: chatscreen main process ended, respawning
[ 5649.476572] init: chatscreen main process ended, respawning
...
[ 5649.608818] init: chatscreen main process ended, respawning
[ 5649.627409] init: chatscreen respawning too fast, stopped

/var/log/upstart/chatscreen.log存在文件。

当我以聊天用户身份 ssh 进入并/usr/bin/screen -S chatscreen -Dm /usr/bin/weechat在 shell 中运行时,它会按预期执行。(它运行命令并阻塞。然后我可以启动另一个 ssh 会话,screen -r/exit weechat,然后原始屏幕命令返回。)

我在 DigitalOcean 上运行 64 位 Ubuntu Server 14.04.1 LTS。

编辑:我也尝试使用 dtach 而不是 screen。唯一的区别是我必须使用,expect fork因为dtach -nforks.dtach -n可以在没有终端的情况下运行,我认为这可能是一个问题screen

不幸的是,我经历了相同的重生周期,却没有任何相应的日志文件/var/log/upstart。但 dmesg 确实说:init: chatdtach main process (1073) terminated with status 1多次。

答案1

Upstart,即使使用 setuid,没有设置 HOME 环境变量-d. 当未指定时,weechat 会尝试使用此变量来查找其配置目录。

weechat 打印Error: unable to get HOME directory以响应此问题。但是,它没有被记录下来,因为 weechat 除了 stdout 之外没有地方输出此错误,而 screen/dtach 除了尽职尽责地返回(因为原始进程已结束)之外没有做任何事情。

您可以通过将 exec 行更改为以下内容来检查这是否是您的问题:

exec /usr/bin/weechat

如果/var/log/upstart/chatscreen.logError: unable to get HOME directory,那么这就是问题所在。

以下是修正后的 upstart 服务文件:

description     "Run a persistent weechat within screen"

respawn

setuid chat
setgid chat

# Not sure if screen needs this.
env LANG=en_US.utf8

exec screen -S chatscreen weechat -d /home/chat/.weechat

或者如果你更喜欢轻量级的 dtach:

description     "Run a persistent weechat within dtach"

respawn

setuid chat
setgid chat

expect fork

env LANG=en_US.utf8

exec dtach -n /home/chat/chatdtach.sock weechat -d /home/chat/.weechat

LANG 环境变量用于使 weechat 识别分离器是否支持 UTF-8。如果没有这个变量,我的 weechat 会在右侧显示奇怪的框,而不是垂直昵称列表分隔符。将其更改为您想要使用的任何语言环境。

我不确定 screen 是否需要 LANG。我只用 dtach 测试过。

相关内容