LINUX.ORG.RU

Как запустить отдельный терминал, в котором бы начал выполняться твой скрипт и после CTRL+C консоль бы осталась жива?

 


0

1

Есть неизменяемый тестовый скрипт-болванка script.sh, задача которого просто занимать bash работой и выходить по CTRL+C. Примерно такой, но сойдёт любой ваш аналог:

#!/bin/bash
while [ true ]
do
   echo "Hello World"
   sleep 1
done

Хочется чего: запустить новый графический терминал типа terminator или urxvt, в котором бы этот скрипт начал работать, а по нажатию CTRL+C в запущенной консоли бы сдох скрипт и появилось приглашение баша. Делаем:

urxvt -hold -e bash -c ~/script.sh

Жмём CTRL+C - вся консоль сдыхает вместе с bash. Ну точнее, благодаря -hold мы можем посмотреть на труп, но она сдыхает.

Максимальная степень извращения, до которой дошёл в экспериментах была: (ну типа, в первом баше запустим второй баш в «интерактивном режиме», скормив второму через stdin команду script.sh).

urxvt -hold -e bash -c "echo '~/script.sh' | bash -i"

Это полный треш и угар, но он на микрометр приближает желаемое. Здесь после нажатия CTRL+C мы хотя-бы видим проблески консольного приглашения, в котором мелькает «exit» и консоль так же сдыхает.

Короче такое решение, поцоны:

Башу нельзя сказать, что после запуска ты должен запустить какой-то скрипт в интерактивном режиме, как будто тебе его юзер напечатал. Он слишком тупой и так не умеет. Имя скрипта с любыми аргументами он воспринимает (пёс) как директиву к однократному исполнению.

За одним исключением-дыркой-лайфхаком: –init-file - он же rcfile: в общем ему нужно подсунуть такой RC-init-скрипт, который бы включал твой скрипт для его первоначального исполнения.

Но просто так указать только свой скрипт нельзя, потому что тогда bash не исполнит всю тыщу системных rc-файлов и твоя консоль будет тухловата и бесцветна. Поэтому надо вклеить твой скрипт после остальных системных rc-файлов: короче:

terminator -e \"cd /mnt/ramdisk && bash --init-file <(cat /etc/profile ~/.bashrc ~/MY_SCRIPT.SH)\"

То есть мы как-бы запускаем terminator (GUI-приложение для консолей), заставив его выполнить в нём баш. Просто баш, без всяких скриптов. Но подсунув наш скрипт ему в init-скрипты, которые он запускает перед официальным стартом. Таким образом достигается требуемый в топике эффект. Запустится terminator, начнёт выполнять ваш скрипт, думая, что это просто такой rcfile. Потом вы жмёте CTRL+C и выполнение rcfile заканчивается и BASH приступает к нормальной работе, показывая prompt и можно далее делать что угодно.

Одно плохо - кнопка вверх не будет работать - она не покажет в истории ваш скрипт, который выполнялся на старте. Жесть конечно.

trisobakov
() автор топика
Ответ на: комментарий от tiinn

Запускай ядерную

Дмитрий Анатольевич, успокойтесь!

alex1101
()
Ответ на: комментарий от tiinn

Шутников развелось. Чтобы было понятно - вопрос не от скуки, а хотелось автоматизировать запуск тестового окружения.

Тестовое окружение - это такой рабочий стол в графической оболочке типа i3, на котором запущено штук 8 терминалов, в каждом из которых работает какая-то скриптина. Оператор должен уметь в любом терминале нажать CTRL+C и перезапустить скриптину или поменять ей параметры.

trisobakov
() автор топика

Попробуйте tmux - он позволяет запустить его с заданным конфигурационным файлом, в котором можно задать несколько консолей и запускать в них программы.

braboar ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.