![如何将 weechat 和 screen 作为 upstart 服务运行且不会出现错误?](https://linux22.com/image/1103272/%E5%A6%82%E4%BD%95%E5%B0%86%20weechat%20%E5%92%8C%20screen%20%E4%BD%9C%E4%B8%BA%20upstart%20%E6%9C%8D%E5%8A%A1%E8%BF%90%E8%A1%8C%E4%B8%94%E4%B8%8D%E4%BC%9A%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF%EF%BC%9F.png)
我想在后台持续运行 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 -n
forks.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.log
说Error: 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 测试过。