~/.profile
читается немногими процессами, среди них оболочки и настольные сессии. Все остальное просто наследуется его родителю. Таким образом, если Вы запускаете свое приложение от Вашей настольной сессии, затем перезапущение настольной сессии является единственным путем. Так выходить из системы и въезжает задним ходом, кажется, самый разумный план действий.
Могли бы быть случаи, где сессия запускается с некоторого сценария, и Вы могли изменить тот сценарий таким способом, которым это обеспечивает механизм для запуска новой сессии, если предыдущий выходит, если некоторое условие удовлетворено. Это, возможно, позволило бы Вам стараться не давать свои учетные данные еще раз. Но этот механизм был бы очень hackish и должен будет существовать перед запуском сессии.
Можно работать 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...
Альтернатива 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
считает статус выхода и закончит цикл.
Более подробное объяснение в этом вопросе это - следование этого.
3>&1
fd 3 открыт, поскольку дубликат stdout. ssh stdout установлен на дубликат fd3, затем 3 закрывается 3>&-
stdout от ssh передается по каналу в цикл чтения, который печатается к stderr >&2
Ничто не выполняется в фоне, поэтому как это помогает?
– X Tian
06.02.2014, 13:59
ssh
. Цикл прогресса ничего не читает до ssh
выходы.
– Stéphane Chazelas
06.02.2014, 14:12
Я узнал, что намного более просто выполнить индикатор выполнения в фоновом режиме вместо команды 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
SIGTERM
редактор или SIGINT
редактор
– Blacklight Shining
07.02.2014, 05:17