У меня есть скрипт, который запускает некоторые программы в фоновом режиме, но после его запуска они не отображаются в списке команды 'jobs'. Почему так?
(./m_prog -t m_prog1 m_config) &
(./m_prog -t m_prog2 m_config) &
(./m_prog -t m_prog3 m_config) &
Но если я выполню каждую из них из терминала, они появятся в «заданиях»
Как можно добиться того же эффекта от команд, выполняемых в скрипте?
решение1
jobs работает только для инстанциации оболочки, которая создала jobs. jobs n
используйте числа, а не pid. После того, как shell запущен внутри скрипта (другой новый процесс), старая оболочка, которая запустила скрипт, jobs (выпущенные в старой оболочке) больше не могут ссылаться на job # 1 в новой оболочке.
Почему? Потому что текущая оболочка может иметь свою собственную задачу № 1. UNIX/Linux поддерживает то, что известно как группа процессов или сеанс. Лидер группы сеанса — это процесс, который владеет tty и взаимодействует с ним через клавиатуру. Найдите описание функции setsid() в вашем руководстве. Если процесс был запущен и все еще работает как дочерний в старой родительской оболочке — лидере, то команда jobs будет работать. В противном случае — нет.