tmux打开终端失败:不是终端。

43

我有一个作为服务启用的Shell脚本,可以启动多个其他的Shell脚本。

service started script -> script1, script2 ,script3 

如果我通过./script1.sh手动启动脚本,那么脚本1将在tmux窗口中打开一个程序,并且一切都可以正常工作。但是,如果通过服务启动脚本在启动时自动启动,则会出现上述错误:

script1应该在tmux窗口中打开一个程序,如果我通过./script1.sh手动启动脚本,那么它可以正常工作,但是当通过服务启动脚本在启动时自动运行时,它就无法正常工作,并显示上述错误:

open terminal failed: not a terminal

为什么会发生这种事情?


一个服务通常不会有关联的tty(终端)。这是一个多用户操作系统,还没有人登录,它要写到谁的终端?为什么这些服务需要交互式shell? - tolanj
有许多脚本可以执行不同的任务,例如备份等等... 然而,这个问题中涉及到的脚本是在 tmux 窗口中运行 Minecraft 服务器。 - STiGYFishh
好的,那么发一下脚本中的 tmux 部分。默认情况下,它会尝试附加到当前的 tty(该 tty 不存在,因此会出错)。如果您在其中有一个新会话,您需要添加一个 -d 参数来防止这种情况。 - tolanj
tmux new -s minecraft "java -args minecarft.jar nogui"tmux新建-s minecraft "java -args minecarft.jar nogui" - STiGYFishh
尝试使用tmux new -d -s minecraft命令:"java -args minecarft.jar nogui" - tolanj
3个回答

52

这里已经有一个答案(链接),但是我认为这个链接更好地总结了它。简而言之,使用-t标志:

ssh -t host tmux attach

如果你想将其设置到你的.ssh/config文件中,可以查看ssh_config手册中的RequestTTY选项:

 RequestTTY
         Specifies whether to request a pseudo-tty for the session.  The
         argument may be one of: ``no'' (never request a TTY), ``yes''
         (always request a TTY when standard input is a TTY), ``force''
         (always request a TTY) or ``auto'' (request a TTY when opening a
         login session).  This option mirrors the -t and -T flags for
         ssh(1).

5
虽然这篇回答提供了我在搜索的答案,但问题实际上与SSH无关,而是关于启动脚本。 - Weaver

19

我认为问题在于该服务没有关联tty。我找到的一个解决方法是将脚本中的tmux调用更改为

tmux new-session -s username -d

(用户名是启动服务的用户)


选项-d并不总是有效(我有一个远程服务器的情况,出现了相同的错误:**打开终端失败:不是终端**)。 - Cyril Chaboisseau
结果肯定会有所不同,但这对我有效。我试图在使用.bash_profile启动openbox kiosk时启动tmux。 - Terrarium

2
如果你使用p10k作为zsh主题,就像这里提到的那样,你应该将这个段落放在.zsrc文件的顶部。
if [ -z "$TMUX" ]; then
  exec tmux new-session -A -s workspace
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接