Отвечать на Ваши два вопроса:
wait
команда, можно попросить, чтобы оболочка ожидала всех процессов в фоновом режиме для окончания прежде, чем продолжиться дальше.Вот сценарий, измененный так, чтобы j
используется для отслеживания количество фоновых процессов. Когда NB_CONCURRENT_PROCESSES
достигнут, сценарий сбросит j
к 0 и ожидают всех фоновых процессов для окончания прежде, чем возобновить, что это - выполнение.
files=(./*.png)
nb_concurrent_processes=4
j=0
for f in "${files[@]}"
do
echo "Processing $f file..."
# take action on each file. $f store current file name
./pngout -s0 "$f" R"${f/\.\//}" &
((++j == nb_concurrent_processes)) && { j=0; wait; }
done
Я понял это. Короткий ответ, я должен был удалить SSH_AUTH_SOCK
от update-environment
. Так как это было в том списке, значение уносилось далеко каждый раз, когда я повторно прикрепил. Благодаря @djf для подсказки. Существенный бит от tmux (1) страница справочника в update-environment
раздел:
Любые переменные, которые не существуют в исходной среде, установлены быть удаленными из среды сессии (как будто-r был дан команде среды набора).
Так как я получил Щедрость, я повторно отправлю свой ключевой комментарий для пользы полноты - и постараться не устанавливать посетителей с той же проблемой на ложном пути:
Tmux' страница справочника заявляет, что среда обновления удалит переменные, "которые не существуют в исходной среде [...], как будто-r был дан команде среды набора".
По-видимому, это, что вызвало проблему. Посмотрите ответ Chris ниже. Однако я все еще не могу вообразить, как переменная могла отсутствовать в "исходной среде" и все же быть допустимой в недавно созданном tmux окне...
Предыдущий ответ:
На удаленной машине смотрите на среду своей оболочки после установления соединения SSH:
user@remote:~$ env | grep SSH
SSH_CLIENT=68.38.123.35 45926 22
SSH_TTY=/dev/pts/0
SSH_CONNECTION=68.38.123.35 48926 10.1.35.23 22
SSH_AUTH_SOCK=/tmp/ssh-hRNwjA1342/agent.1342
Важный здесь является SSH_AUTH_SOCK, который в настоящее время устанавливается на некоторый файл в/tmp. При исследовании этого файла Вы будете видеть, что это - сокет домена Unix - и подключено к конкретному экземпляру ssh, в котором Вы соединились на. Значительно, это изменяется каждый раз, когда Вы соединяетесь.
Как только Вы выходите из системы, что конкретного файла сокета не стало. Теперь, если Вы пойдете и повторно прикрепите свою tmux сессию, то Вы будете видеть проблему. Это имеет среду от того, когда tmux был первоначально запущен - который, возможно, был несколько недель назад. Тот конкретный сокет давно неисправен.
Так как мы знаем, что проблема имеет отношение к знанию, где в настоящее время живой сокет аутентификации SSH, позвольте нам просто положить его на предсказуемое место!
В Вашем .bashrc или .zshrc файле на удаленной машине, добавьте следующее:
# Predictable SSH authentication socket location.
SOCK="/tmp/ssh-agent-$USER-screen"
if test $SSH_AUTH_SOCK && [ $SSH_AUTH_SOCK != $SOCK ]
then
rm -f /tmp/ssh-agent-$USER-screen
ln -sf $SSH_AUTH_SOCK $SOCK
export SSH_AUTH_SOCK=$SOCK
fi
Я не думаю, что даже необходимо поместить 'команду среды обновления' в tmux.conf. Согласно странице справочника, SSH_AUTH_SOCK уже покрыт по умолчанию.
Мой ответ является выборкой этого сообщения в блоге Mark 'xb95' Smith, кто объясняет ту же проблему для экрана.
$SSH_AUTH_SOCK
в новых оболочках это об установке $SSH_AUTH_SOCK
в новых tmux окнах, прежде чем получен .bashrc/.zshrc.
– Chris W.
18.05.2013, 21:24
tmux neww ssh somehost
).
– Chris W.
18.05.2013, 22:06
SSH_AUTH_SOCK
. Этот подход только работает, в то время как tmux заседание открыто через новое соединение SSH.
– phylae
17.11.2015, 06:47
Вместо того, чтобы использовать tmux для обработки моего ssh-агента у меня есть удар, обрабатывают его с:
### SSH Agent ### {{{
SSH_ENV="$HOME/.ssh/environment"
function start_agent {
echo "Initialising new SSH agent..."
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" > /dev/null
/usr/bin/ssh-add;
}
## Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" > /dev/null
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
### End SSH Agent ### }}}
У меня есть это в моем ~/bashrc, и он работает отлично.
$SSH_AUTH_SOCK
установлен правильно в моих оболочках, но когда я делаю что-то как tmux neww ssh somehost
, Мне предложат мой пароль разблокировать мой закрытый ключ, если я не буду работать tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
.
– Chris W.
14.05.2013, 00:18
объяснение djf приносит другое возможное решение по моему мнению:
Прежде tmux
/ screen
работает:
ssh-agent
.tmux
/ screen
с переменной (переменными) среды для этого ssh-agent
.Это не могло использовать SSH, передающий клиенту, но относительно этого не попросили.
ssh-agent
не связывает с TTY, почему должен это быть уничтоженным на выходе из системы(?) — почему использование nohup
? Корректный
– poige
19.05.2013, 05:40
Я ответил на аналогичный вопрос на StackOverflowhttps://stackoverflow.com/a/49395839/241025. Поскольку эта страница появилась первой в моих поисковых запросах Google, я хотел опубликовать ее сводную версию здесь.
Чтобы каждый сеанс tmux имел набор настраиваемых переменных среды, необходимо добавить значения в -переменные среды сеанса в tmux. Вот пример того, как это сделать.
tmux new-session -s one
tmux setenv FOO foo-one
export FOO='foo-one'
Последний шаг явного экспорта FOO необходим для того, чтобы текущая панель получила переменную среды. Любые последующие панели или окна, созданные вами для этого сеанса tmux, будут наследовать FOO, но не будут отображаться в других сеансах.
.tmux.conf
заставить это работать:set -g update-environment "SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY"
Вы видите проблемы сssh
или переменные среды в целом? – Chris W. 31.05.2015, 19:16