Странное поведение с командой bg

Как отправить процесс (приложение) в фоновый режим, если он всегда ожидает ввода на терминал и все время отправляет полученные данные из uart в stdout?

Я не могу отправить свое приложение на фон с помощью CTRL + Z & bg% number / bg %%.

Любая идея, что не так?

Мое устройство (программа) ожидает некоторых команд ввода из терминала для конфигурации, прежде чем оно будет отправлено на задний план. И я получаю ошибку при попытке отправить ее на задний план.

# [CTRL-Z] [1]+ Stopped sudo ./my_app # bg %1 

и он показывает мне что-то вроде этого:

 [1]+ Stopped sudo ./my_app 

3 Solutions collect form web for “Странное поведение с командой bg”

Когда программа, работающая в фоновом режиме, пытается считывать с терминала, она останавливается сигналом SIGTTIN . В настоящее время вход идет на передний план¹; это было бы разрушительно, если бы случайный вход был отправлен в программу переднего плана или в фоновую программу. Таким образом, фоновая программа приостанавливается до тех пор, пока она не появится на переднем плане.

Если вам нужно только передать данные в вашу программу в начале, проведите в нее данные.

 echo "config=foo" | ./my_app & 

Если вам нужно время от времени взаимодействовать с программой, но она может выполняться без присмотра большую часть времени, запустите ее в терминальном мультиплексоре, таком как Screen или Tmux . Например, с экраном:

 screen -S my_app ./my_app 

Введите необходимый ввод, затем нажмите Ctrl + A, чтобы отключить сеанс экрана, т.е. пусть он запустится в фоновом режиме и вернется к исходному терминалу. Когда вы хотите снова взаимодействовать с программой, подключитесь к сеансу экрана:

 screen -S my_app -rd 

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

¹ Process group, но я не собираюсь вдаваться в эту тонкость здесь.

Если ваша команда продолжает читать из tty, вам нужно позвонить

fg

после того, как вы получите сообщение «остановлено», чтобы ввести ожидаемый ввод.

Разве вы не должны передавать аргументы в stdin, потому что они продолжают работать? Если вы просто CTRL-Z, он будет ждать ввода в фоновом режиме.

например

 $ cat test.sh #!/bin/bash read var echo $var $ cat <<EOF > input d EOF $ ./test.sh < input d $ ./test.sh <input > stdout 2> stderr & [2] 23180 [2]- Done ./test.sh < input > stdout 2> stderr $ cat stdout d 

При попытке запустить его, не передавая вход:

 $ ./test.sh > stdout 2> stderr & [2] 13012 [2]+ Stopped ./test.sh > stdout 2> stderr 
  • Получает ли этот диспетчер процесс зомби?
  • Как безопасно выйти из журнала, который занимает 75% моего процессора в течение нескольких часов?
  • Что значит '?' представлять под TTY
  • «Перезапустить» процесс в том же терминале?
  • bash + как хранить скрипты оболочки
  • Процесс Weblogic просто внезапно убит на redhat linux
  • Как узнать имена потоков, которые выполняются на конкретном ядре
  • Как убить команду, выполненную из скрипта?
  • Текущие переменные среды процесса
  • Как найти PID конкретной программы?
  • принимающая команда как параметр в bash
  • Interesting Posts

    Можно ли остановить команду выключения?

    что является хорошим инструментом для восстановления файлов в их пути, когда вы rm -r от root?

    Запись в файловую систему ext4 зависает, пока лазинит в фоновом режиме

    Разница между «bash executable» и «bash -c executable»

    Какие комбинации графических процессоров NVidia хорошо поддерживаются драйвером 319.82?

    bash добавление имени файла в команду alias

    извлечь значение между двумя шаблонами поиска на одной строке

    Клавиатура не работает должным образом

    Почему ssh -g говорит, что адрес уже используется?

    Как заставить `wget` использовать метод GET для извлечения реквизитов страниц?

    Как получить фактическое использование памяти процесса (включая данные в swap)

    Ищете способ улучшить обнаружение синаптической / тачпадной ладони

    Убейте только один процесс Java

    Запуск приложения GTK от CHROOT во время запуска LightDM

    Нельзя подписывать / шифровать, если я не запускаю gpg-agent вручную

    Linux и Unix - лучшая ОС в мире.