Запустите команду в новом фоновом окне tmux и дождитесь завершения процесса - PullRequest
2 голосов
/ 23 февраля 2020

Я пытаюсь использовать tmux в скрипте, чтобы он выполнял команду, которая занимает некоторое время (скажем, 'ping - c 5 8.8.8.8', например) в новой скрытой панели при блокировке сам текущий скрипт до тех пор, пока не закончится эхо-запрос контролировать и / или взаимодействовать с ним (не обязательно пинговать).
(ср. РЕДАКТИРОВАТЬ)

Вот некоторый псевдо bash код, чтобы более четко показать, что я пытаюсь сделать:

echo "Waiting for ping to finish..."
echo "Ctrl-b + p to switch pane and see running process"

tmux new-window -d 'ping -c 5 8.8.8.8' # run command in new "background" window
tmux wait-for                          # display "Done!" only when ping command has finished

echo "Done!"

Я знаю, что команды tmux здесь на самом деле не имеют никакого смысла, но это просто для иллюстрации.

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

РЕДАКТИРОВАТЬ

Спасибо Nicholas Marriott за указание на то, что опция -d существует, когда при открытии нового окна, чтобы избежать автоматического переключения на него. Теперь единственной проблемой является блокировка основного сценария до завершения команды.

Я попробовал следующее, надеясь, что это сработает, но также не сработает (сценарий не возобновляется).

tmux new-window -d 'ping -c 5 8.8.8.8; tmux wait -S ping' &
tmux wait $!

Возможно, есть способ поиграться с процессами (используя fg, bg ...), но я до сих пор не понял.

Подобные вопросы:
[1] Сделать блокировку tmux до завершения программы
[2] Bash - выполнение сценариев блокировки в tmux
[3] Как скрыть tmux pane
[4] как ждать окончания первой команды до sh?

1 Ответ

1 голос
/ 24 февраля 2020

Вы можете использовать wait-for, но вам нужно дать ему канал и дать сигнал этому каналу, когда ваш процесс завершится, что-то вроде:

tmux neww -d 'ping blah; tmux wait -S ping'
tmux wait ping
echo done

Если вы думаете, что можете запустить скрипт несколько раз в параллельно, я предлагаю сделать имя канала с помощью mktemp или аналогичного (и удалить файл, когда вернется wait-for).

wait-for не может автоматически ожидать выхода таких элементов, как панель или windows, тишина в панели и т. д., но я бы хотел, чтобы это было реализовано в какой-то момент.

...