【问题标题】:Executing new tmux session in shell script with exec "$@"使用 exec "$@" 在 shell 脚本中执行新的 tmux 会话
【发布时间】:2020-04-29 02:16:13
【问题描述】:

我只有一个通过 SSH 连接到远程设备的 shell(sh,而不是 bash)登录。该脚本以exec "$@" 结尾,据我所知,它会将所有参数作为字符串传递。 现在我想在一个新的 tmux 会话中执行最后一个命令,以便程序在连接丢失的情况下继续运行。 这是一个机器人项目,因此我假设连接被部分中断。

如何将其包装成一个命令,在 tmux 中运行 exec "$@"

我已经尝试过: tmux new "exec \"$@\""tmux new -s session send-keys "exec \"$@\"" 以及只有"exec $@"的两种变体@

但是,shellchecker 或我的草稿 .sh 文件似乎没有任何作用。如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 澄清一下:这与 ROS 一起使用。 Roslaunch 允许机器标签通过 ssh 连接到另一台机器,在该机器上执行默认脚本,最后一行是 exec "$@",经过一些变量设置。我想将最后一部分包装到 tmux 中,以防连接丢失。

标签: bash shell sh tmux


【解决方案1】:

试试:

exec tmux new -- "$@"

如果不起作用,您可以尝试以下方法:

exec tmux new -- sleep 10000

并尝试附加以确保 tmux 正在运行(例如脚本可以找到 tmux)。

sh -x 也可能有助于查看实际运行的内容。

还要记住,如果 tmux 已经启动,里面的环境可能与脚本中的不同。

【讨论】:

  • 我现在创建了一个名为testtmux.sh 的文件,其内容为:#!/usr/bin/env sh,第二行为exec tmux new -- "$@"。当我使用sh -x ./testtmux.sh 通过终端运行它时,它会将我弹出到一个空的 tmux shell 中。当我运行sh -x ./testtmux.sh pwd 时,我在下一个命令行中收到[exited]62;c。我一无所知
  • pwd 立即退出,因此 tmux 服务器也将退出。要么改用sleep 10000,要么改用tmux start \; set -g remain-on-exit on \; new -- "$@"
  • tmux 还没有在机器上启动,并且一直抛出同样的错误。在 ROS-ssh 访问方面,我收到错误 open terminal failed: not a terminal,将 exec tmux new -- "$@" 附加到我的 env.sh 的末尾
  • 如果您是从某个没有外部终端(如脚本)的地方启动 tmux,则需要将 -d 添加到新会话中。所以tmux new -d ....
  • new -d 将在未附加会话的情况下启动 tmux,如果您需要附加它,可以尝试 ssh -t-tt 强制它创建一个 pty。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多