Можно ли сохранить последовательность команд после отправки ctrl + c на промежуточном этапе?

У меня есть программа, давайте назовем ее xcommand . когда он запущен, он не имеет stdout, но он записывает свой вывод в файл.

То, что я хочу достичь, выглядит следующим образом: после запуска xcommand во время его запуска я хочу видеть его вывод в реальном времени, и если бы я нашел что-то ненормальное, я затем выключил вывод и в то же время вернул xcommand ,

Я пробовал несколько способов, например, в сценарии bash, который я пишу

 xcommand & tail -f outputfile fg 

Однако проблема в том, что, как только я ctrl+c , все дело останавливается. И fg не работает вообще.

Так можно ли достичь того, чего я хочу?

2 Solutions collect form web for “Можно ли сохранить последовательность команд после отправки ctrl + c на промежуточном этапе?”

Когда неинтерактивные (как в скриптах), оболочки не выполняют контроль над заданиями. Они не ставят асинхронные задания в фоновом режиме. Они остаются в той же группе процессов, что и остальная часть скрипта, поэтому Ctrl-C вызовет отправку SIGINT (при условии, что сам сценарий запущен на переднем плане).

Вы можете выдать set -m для оболочки, чтобы выполнять контроль заданий, когда они не интерактивны:

 #! /bin/bash - set -m xcommand & # start as a background job, so won't receive SIGINT upon ^C tail -f outputfile # start in foreground. Will receive SIGINT. fg # bring the xcommand job in foreground and wait for it. Will receive SIGINT 

Чтобы это сработало, этот сценарий должен быть запущен на переднем плане. Также будьте осторожны, если вы нажмете Ctrl-Z или если фоновая работа попытается прочитать с терминала, у вас возникнут проблемы.

По моему опыту, этот трюк только «работает» в bash или yash , как правило, не в других Bourne-подобных оболочках.

Если вы запустите свою программу в фоновом режиме с помощью

 xcommand & 

нажатие Ctrl + C в оболочке не остановит его.

Если вы это сделаете

 tail -f outputfile 

и нажмите Ctrl + C , только процесс tail будет завершен.

Если вы это сделаете

 fg 

вы поместите xcommand на передний план. Теперь нажатие Ctrl + C завершит процесс xcommand .

Итак, не ставьте xcommand процесс на передний план, или, если хотите, нажмите Ctrl + Z и выполните bg чтобы вернуть его обратно в фоновый режим.

  • Вычтите 1 из всех имен файлов (переименуйте их) в каталог.
  • Удалить строки, содержащие пустые поля
  • Как напечатать имя отсутствующих файлов в папке?
  • Как я могу кэшировать разблокировку PGP для перехода unix, когда я нахожусь в виртуальном терминале?
  • Как ответить YES автоматически командой cryptsetup luksFormat?
  • Перемещение файлов без расширения с помощью mv
  • Получить выходной ток
  • Как выполнить mv эквивалент да | cp -rf в каталогах?
  • Выполнение и изменение процесса в одной команде
  • Отображение номера недели в определенном формате с помощью ncal или cal
  • Python теперь считает, что аргументы являются файлами: Broken emerge, pip, livestreamer и большинство инструментов с использованием Python
  • Linux и Unix - лучшая ОС в мире.