2012-06-23 5 views
1

У нас есть скрипт с обновлением, который запускает apt-get update && apt-get upgrade одновременно во всех наших управляемых системах. В идеале мы хотели бы запустить их во время сеанса экрана. Когда я делаю это так:Экран GNU: запуск команды в сеансе без изменения окна к ней

Файл: 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.

Бонусные баллы, если есть возможность сохранить окна с завершенными процессами, но не отделяя их от окон активными процессами.

ответ

0

Благодаря 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 
0

W/r/t сохранение окон после выхода подпроцесса, одна из возможностей заключается в вызове команды zombie в файле конфигурации экрана, в котором требуется указать два символа клавиатуры, которые убивают или восстанавливают окно соответственно. Например .:

zombie KR 

Затем K убьёт окно которого подпроцесс завершается, в то время как R будет пытаться возобновить подпроцесс в том же окне. Обратите внимание, что в окне зомби эти клавиши захватываются на верхнем уровне (т. Е. Не предшествуют их обычной последовательности символов символов управления экраном).

Для того, чтобы предотвратить автоматическое переключение на вновь созданного окна, попробуйте изменить вызов экрана, чтобы что-то вроде следующего:

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

Спасибо, я знаю о зомби, но это не будет держать окна с возбужденными процессов отдельно. «Другое» - это взломать, и я, вероятно, даже не рассматривал бы его как последнее средство решения (например, он меняет окно, которое нацелено, когда я выдаю «другое», нажимая '^ A^A') , –

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 не заботится.

В качестве примера вы можете назвать каждое окно «upgrade», но это затруднит идентификацию ваших сессий SSH с первого взгляда. Вместо этого в этом примере добавляется значение переменной хоста (заполненное вашим циклом) для каждого имени окна. Это упрощает навигацию или программно закрывает окна, которые вам больше не интересны. Это особенно ценно, когда у вас много незакрытых окон, отображающих завершенные процессы.

В целом, синтаксис немного чище и интуитивно понятен, чем экран GNU для такого рода задач, но ваш пробег может отличаться.

+0

+1 Спасибо за этот ответ, я сделал свой сценарий на его основе. См. Мой ответ ниже, я приму его, как только мне позволено. –

 Смежные вопросы

  • Нет связанных вопросов^_^