Как выполнить код в новой сессии tmux - из текущей сессии?

13

Я использую Ubuntu 16.04, и мне нужно следующее tmuxрешение, потому что я хочу запустить процесс тайм-аута, sleepпоскольку в моем конкретном случае я не был удовлетворен atи столкнулся с ошибкой nohup(при объединении nohup-sleep). Теперь, tmuxкажется, лучшая альтернатива, так как он имеет свой собственный механизм отсутствия зависания и фактически работает нормально при ручном использовании (я задаю вопрос только в отношении автоматизации процесса, который я уже могу сделать вручную).

Что мне нужно:

Мне нужен способ сделать следующие 3 действия, все в одной операции:

  1. Присоединение нового tmuxсеанса.
  2. Внедрение готового набора команд в этот сеанс, например (sleep 30m ; rm -rf dir_name ; exit). Я бы особенно предпочел многострочный набор, а не один длинный ряд.
  3. Выполнение вышеупомянутой команды устанавливает момент, когда она была закончена, чтобы быть записанной как stdin в новом tmuxсеансе.

Другими словами, я хочу выполнить кодовый набор в другом tmuxсеансе, который был специально создан для этой цели, но сделать все за одну операцию.


Примечания:

  • Я стремлюсь сделать все из моей первоначальной рабочей сессии (той, в которой я работаю большую часть времени). Как правило, я не собираюсь посещать только что созданный сеанс, я просто хочу создать его с автоматически выполняемым кодом, и все.

  • Если возможно, я бы предпочел решение heredoc. Я думаю, что это наиболее эффективно.

JohnDoea
источник

Ответы:

18

Если вы поместите код, в котором вы хотите выполнить, например /opt/my_script.sh, очень легко сделать то, что вы хотите:

tmux new-session -d -s "myTempSession" /opt/my_script.sh

Это запускает новый отдельный сеанс с именем «myTempSession», выполняющий ваш скрипт. Позже вы можете присоединиться к нему, чтобы проверить, что он делает, выполнив tmux attach-session -t myTempSession.

Это , на мой взгляд, самое простое и элегантное решение. Я не знаю ни о каком простом способе выполнения команд из stdin (читай "из heredocs") с помощью tmux. Взламывая вокруг, вы даже сможете сделать это, но это все равно будет (и похоже) на взлом.

Например, вот хак, который использует команду, которую я предложил выше, для имитации желаемого поведения (= выполнить код в новом сеансе tmux из heredoc. На жестком диске сервера не происходит запись, так как создается временный файл /dev/shm, который является tmpfs):

(
  cat >/dev/shm/my_script.sh &&
  chmod +x /dev/shm/my_script.sh &&
  tmux new-session -d '/dev/shm/my_script.sh; rm /dev/shm/my_script.sh'
) <<'EOF'
    echo "hacky, but works"
EOF
Марио Витале
источник
1
Уважаемый Марио. Всегда приятно читать ваши ответы. Я не уверен, правильно ли я понимаю, пожалуйста, скажите мне, если я ошибаюсь: 1.есть два способа сделать это, один из них включает в себя сначала создание временного скрипта (который содержит код) и выполнение его с созданием, а второй - наследственность путь. 2.Если работает второй способ (когда каждая строка эха содержит каждую строку кода heredoc), почему мы должны рассматривать это как хак, если это допустимый код Bash? Может быть, потому что строки heredoc отражаются и не выполняются регулярно в heredocs?
JohnDoea
2
@ Benia Это взлом, поскольку он работает только на некоторых системах Unix, которые имеют /dev/shm. Это также хак, поскольку он более сложен, труден для чтения, понимания и обслуживания, чем просто запись сценария в обычный файл и начало с него tmux.
Кусалананда
1
Как объяснил @Kusalananda, heredocs для выполнения кода вообще плохая практика. Хотя это и уродливо и недостижимо, оно работает, но оно заставляет вас искать обходной способ сделать очень простые вещи ... просто сравните первый и второй блоки кода в ответе: можете ли вы сказать, как это работает? Сколько времени вам понадобится, чтобы сделать это? Это даже больше, чем хак, поскольку tmux не имеет возможности выполнять команды из stdin (за исключением еще более хакерских способов, так что я даже не буду обдумывать), поэтому внешние сценарии - единственный (ответ на 1.ваш вопрос) способ ,
Марио Витале
1
Извините, в первом примере произошла ошибка (команда «new-session» не подразумевается, если вы используете аргументы). Теперь это исправлено.
Марио Витале
1
Теперь, когда я выполняю tmux new-session -d -s "myTempSession" /opt/my_script.shего, он не открывает временный файл для вставки кода ... Мне нужно открыть скрипт непосредственно из текущего сеанса или, по крайней мере, кое-что переместить в новый сеанс, а затем сразу вернуться к текущая сессия. Кстати, я планирую выплатить вознаграждение за всю вашу помощь, так как это меньшее, что я могу сделать, чтобы поблагодарить вас, и я мог бы дать вознаграждение за 11 часов.
JohnDoea