Як виконати код у новому сеансі 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сеансі, який був спеціально створений для цієї причини, але робити все за одну операцію.


Примітки:

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

  • Якщо можливо, я вважаю за краще рішення гередока. Я думаю, що це найефективніше.

Відповіді:


18

Якщо ви помістите код, який ви хочете виконати, наприклад /opt/my_script.sh, зробити це дуже просто:

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

Починається новий окремий сеанс під назвою "myTempSession", який виконує ваш сценарій. Пізніше ви можете долучитись до нього, щоб перевірити, що він робить, виконавши tmux attach-session -t myTempSession.

Це , на мою думку, найпростіше та елегантне рішення. Мені невідомий будь-який простий спосіб виконання команд stdin (читати «з гередок») з 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.Є два способи зробити це, один передбачає спершу створення тимчасового сценарію (який містить код) та виконання його зі створенням, а другий - heredoc шлях. 2.Якщо другий спосіб працює (коли кожен ехо-рядок містить кожний рядок коду гередока), чому ми повинні розглядати це як хак, якщо це дійсний код Bash? Може тому, що рядки гередока перегукуються і не виконуються регулярно в гередоках?
JohnDoea

2
@Benia Це хакер, оскільки він працює лише в деяких системах Unix, які є /dev/shm. Це також хак, оскільки це складніше, важче для читання, розуміння та обслуговування, ніж просто написання сценарію до звичайного файлу та початок з цього tmux.
Кусалаланда

1
Як пояснив @Kusalananda, гередоки для виконання коду взагалі є поганою практикою. Незважаючи на те, що це некрасиво і немислимо, воно працює, але воно змушує вас знайти круговий спосіб виконання інакше дуже простих речей ... просто порівняйте перший і другий кодові блоки у відповіді: чи можете ви сказати, як це працює? Скільки часу потрібно для цього? Це ще більше хака, оскільки tmux не має можливості виконувати команди stdin (окрім навіть більш хакізних способів, таких некрасивих, я навіть не вважаю), тому зовнішні скрипти - єдиний (відповідь на 1.ваше запитання) спосіб .
Маріо Вітале

1
На жаль, у першому зразку сталася помилка (команда "новий сеанс" не передбачається, якщо ви використовуєте аргументи). Тепер це виправлено.
Маріо Вітале

1
Тепер, коли я tmux new-session -d -s "myTempSession" /opt/my_script.shйого виконую, він не відкриває для мене тимчасовий файл, щоб вставити код ... Що мені потрібно - це відкрити скрипт безпосередньо з поточного сеансу або хоча б щось перейти на новий сеанс, а потім безпосередньо повернутися до поточний сеанс. До речі, я планую надати щедрість за всю вашу допомогу, оскільки це найменше, що я можу зробити, щоб подякувати вам, і я міг би дати бонус за 11 годин.
JohnDoea

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.