1

我们有一个有人值守的升级脚本,它会apt-get update && apt-get 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.

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

4

3 回答 3

2

你可以用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 会话。相反,此示例将主机变量的值(由您的 for 循环填充)附加到每个窗口名称。这使得导航或以编程方式关闭您不再感兴趣的窗口变得更容易。当您有许多显示已终止进程的未关闭窗口时,这尤其有价值。

总体而言,对于此类任务,语法比 GNU 屏幕更简洁和直观,但您的里程可能会有所不同。

于 2012-06-23T22:35:46.830 回答
0

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

zombie KR

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

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

screen -X eval 'screen sh -c "ssh $host \"apt-get update && apt-get upgrade\""' 'other'
于 2012-06-23T22:29:21.077 回答
0

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

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

#!/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
于 2012-06-24T11:59:11.450 回答