Выполните параллельную команду при ожидании ssh

~/.profile читается немногими процессами, среди них оболочки и настольные сессии. Все остальное просто наследуется его родителю. Таким образом, если Вы запускаете свое приложение от Вашей настольной сессии, затем перезапущение настольной сессии является единственным путем. Так выходить из системы и въезжает задним ходом, кажется, самый разумный план действий.

Могли бы быть случаи, где сессия запускается с некоторого сценария, и Вы могли изменить тот сценарий таким способом, которым это обеспечивает механизм для запуска новой сессии, если предыдущий выходит, если некоторое условие удовлетворено. Это, возможно, позволило бы Вам стараться не давать свои учетные данные еще раз. Но этот механизм был бы очень hackish и должен будет существовать перед запуском сессии.

3
06.02.2014, 11:22
3 ответа

Можно работать ssh в фоновом режиме и имейте его, пишут его вывод в FIFO

#! /bin/bash
mkfifo fifo-ssh
(ssh host "app-status"; echo error;) >fifo-ssh &
exec 3<>fifo-ssh
until read -t 1 -u 3 status; do
  echo -n .
done
# if [ "$status" = error ]; then...
5
27.01.2020, 21:10

Альтернатива Hauke, который не включает создание именованного канала (и стычка, связанная с эксклюзивным доступом, очистка... его), который сохраняет статус выхода, и поддерживает многострочный вывод:

result=$(
  {
    {
      ssh host app-status >&3 3>&-; echo "$?"
    } | {
      until read -t1 ret; do
        printf . >&2
      done
      exit "$ret"
    }
  } 3>&1
)

должен работать в zsh, ksh93 и bash ($status является особенным (псевдоним для $?) в zsh как в (t)csh).

Выше, у нас есть подоболочка ({ ssh ...; echo "$?"; }) чей вывод переходит в until цикл. Ничто не производится той подоболочкой кроме $? когда ssh возвраты. ssh произведите себя, переходит в $result посредством дескриптора файла 3, который мы сделали для указания на канал, который подает замену команды.

Так, в то время как ssh работает, read -t1 будет тайм-аут, и как только ssh возвраты, read считает статус выхода и закончит цикл.

Более подробное объяснение в этом вопросе это - следование этого.

5
27.01.2020, 21:10
  • 1
    , просто пытаясь понять. Сначала 3>&1 fd 3 открыт, поскольку дубликат stdout. ssh stdout установлен на дубликат fd3, затем 3 закрывается 3>&- stdout от ssh передается по каналу в цикл чтения, который печатается к stderr >&2 Ничто не выполняется в фоне, поэтому как это помогает? –  X Tian 06.02.2014, 13:59
  • 2
    @XTian, нет, видит мое редактирование. fd 3 только используется для переноса исходного stdout в той замене команды к ssh. Цикл прогресса ничего не читает до ssh выходы. –  Stéphane Chazelas 06.02.2014, 14:12
  • 3
    я открыл это как новый вопрос постараться не забивать этого с комментариями. –  X Tian 06.02.2014, 14:38
  • 4

Я узнал, что намного более просто выполнить индикатор выполнения в фоновом режиме вместо команды ssh. Что-то вроде этого:

function progress {
while :
do
    sleep 1
    echo -e ".\c"
done
}

progress &

PROGRESS_PID=$!

ssh_command_runs_here

status_check_command_here

kill -9 $PROGRESS_PID
0
27.01.2020, 21:10
  • 1
    , Работает ли это, зависит от stty tostop установка. вставка –  Hauke Laging 06.02.2014, 23:58
  • 2
    @HaukeLaging можно ли объяснить больше? –  coffeMug 07.02.2014, 00:33
  • 3
    "Фоновые процессы, которые пытаются читать из (пишут в то, когда stty tostop в действительности) терминал отправляется SIGTTIN (SIGTTOU) сигнал терминальным драйвером ядра, который, если не поймано, приостанавливает процесс". очень хороший –  Hauke Laging 07.02.2014, 00:36
  • 4
    Возможно, необходимо найти индикатор хода выполнения, который умрет когда SIGTERMредактор или SIGINTредактор –  Blacklight Shining 07.02.2014, 05:17
  • 5
    у меня есть проблема; когда я уничтожаю сценарий (Ctrl-C) при развитии, точки продолжают печатать на экране! –  coffeMug 07.02.2014, 12:16

Теги

Похожие вопросы