백그라운드에서 일부 프로그램을 실행하는 스크립트가 있지만 실행 후 "jobs" 명령으로 나열되지 않습니다. 왜 이런거야?
(./m_prog -t m_prog1 m_config) &
(./m_prog -t m_prog2 m_config) &
(./m_prog -t m_prog3 m_config) &
하지만 터미널에서 각각을 실행하면 "작업"에 나타납니다.
스크립트 내에서 실행되는 명령에서 동일한 효과를 얻으려면 어떻게 해야 합니까?
답변1
작업은 작업을 생성한 셸의 인스턴스화에만 적용됩니다. jobs n
pid 대신 숫자를 사용하세요. 셸이 스크립트(또 다른 새 프로세스) 내에서 실행되면 스크립트를 시작한 이전 셸, 작업(이전 셸에서 실행됨)은 더 이상 새 셸에서 작업 #1을 참조할 수 없습니다.
왜? 현재 쉘은 자체 작업 #1을 가질 수 있기 때문입니다. UNIX/Linux는 소위 프로세스 그룹 또는 세션을 유지합니다. 세션의 리더는 tty를 소유하고 키보드를 통해 tty와 상호 작용하는 프로세스입니다. 매뉴얼에서 setid() 함수에 대한 설명을 찾아보세요. 작업 명령은 프로세스가 시작되어 이전 상위 셸(리더)에서 하위 프로세스로 계속 실행되는 경우 작동합니다. 그렇지 않으면 작동하지 않습니다.