【问题标题】:GNU screen: Launch command in session without changing window to itGNU屏幕:在会话中启动命令而不更改窗口
【发布时间】:2012-06-25 18:22:09
【问题描述】:

我们有一个有人值守的升级脚本,它会在我们所有的托管系统上同时启动 apt-get update && apt-get upgrade。理想情况下,我们希望在屏幕会话中启动它们。当我这样做时:

文件:upgrade.sh


for host in $ALLHOSTS
do
    some_commands_which_take_considerable_time
    screen -X screen sh -c "ssh $host \"apt-get update && apt-get upgrade\""
done

$ screen ./upgrade.sh

,它可以工作,但是由于会话中有新窗口到达,它们会自动切换到。相反,我宁愿有一个固定活动窗口的版本,除非包含的进程退出或者我使用 ^A n 手动切换。

如果有可能保留带有已退出进程的窗口,但将它们与带有活动进程的窗口分开,则可以加分。

【问题讨论】:

    标签: bash sh sysadmin gnu-screen


    【解决方案1】:

    您可以使用tmux 执行此操作。例如:

    # Start a session named "apt-get" and leave it running in the background.
    tmux session-new -d -s apt-get
    
    # Preserve windows with inactive processes.
    tmux set-option -t apt-get set-remain-on-exit on
    
    # Start a new window without switching to it. You can also do this from
    # within a running tmux session, not just outside of it.
    tmux new-window -d -t apt-get -n upgrade-$host \
         "ssh $host 'apt-get update && apt-get upgrade'"
    

    请注意,您可以拥有多个具有相同名称的窗口,或者修改 -n 标志的参数以获得唯一名称。 tmux 应用程序不在乎。

    例如,您可以将每个窗口命名为“升级”,但这会使您难以一目了然地识别您的 SSH 会话。相反,此示例将 host 变量的值(由您的 for 循环填充)附加到每个窗口名称。这样可以更轻松地导航或以编程方式关闭您不再感兴趣的窗口。当您有很多未关闭的窗口显示已终止的进程时,这尤其有用。

    总体而言,此类任务的语法比 GNU screen 的语法更简洁、更直观,但您的使用范围可能会有所不同。

    【讨论】:

    • +1 感谢您的回答,我已经根据它制作了我的脚本。请参阅下面的答案,我会尽快接受。
    【解决方案2】:

    W/r/t 在子进程退出后保留窗口,一种可能性是在屏幕配置文件中调用zombie 命令,这要求您分别指定两个键盘字符来杀死或恢复窗口.例如:

    zombie KR
    

    然后,K 将杀死一个子进程已终止的窗口,而R 将尝试在同一窗口中重新启动子进程。请注意,在僵尸窗口中,这些键是在顶层捕获的(即,不要在它们之前加上正常的屏幕控制字符前缀序列)。

    为了防止自动切换到新创建的窗口,请尝试将您的屏幕调用更改为以下内容:

    screen -X eval 'screen sh -c "ssh $host \"apt-get update && apt-get upgrade\""' 'other'
    

    【讨论】:

    • 谢谢,我知道僵尸,但这不会让窗口与退出的进程分开。 other 是一个 hack,我什至可能不会将其视为最后的解决方案(例如,当我自己按 ^A ^A 发出 other 时,它会更改目标窗口)。跨度>
    【解决方案3】:

    感谢 CodeGnome,我可能会选择 tmux,因为我相信屏幕无法做到这一点(这真的很不幸!)。

    为了更好地了解如何使用它:

    #!/bin/sh
    
    tmux new-session -d -s active
    tmux new-session -d -s inactive
    tmux set-option -t active set-remain-on-exit on
    
    for host in $ALLHOSTS
    do
        tmux new-window -d -t active: -n upgrade-$host "
            ./do_upgrade_stuff.sh $host
            tmux move-window -s active:upgrade-$host -t inactive:
        "
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多