자체 프로세스 그룹에서 bash 스크립트를 시작하는 방법

자체 프로세스 그룹에서 bash 스크립트를 시작하는 방법

다른 bash 스크립트에서 bash 스크립트를 시작하고 싶지만 터미널에서 실행하는 것처럼 자체 프로세스 그룹에서 시작합니다.

비슷한 질문이 여러 개 있는데 제 예와 일치하는 답변을 찾을 수 없습니다.

이 두 스크립트를 사용하세요

$ cat main.sh 
#! /usr/bin/env bash

set -e

echo if this has been started in its own group the following will pass
ps -o ppid,pgid,command $$
ps -o pgid | grep $$
echo passed

$ cat wrapper.sh 
#! /usr/bin/env bash

set -e

./main.sh

혼자 실행할 main.sh때 터미널은 이것을 자체 그룹에 넣습니다 .

$ ./main.sh 
if this has been started in its own group the following will pass
 PPID  PGID COMMAND
20553  1276 bash ./main.sh
 1276
 1276
 1276
passed
$ echo $?
0

main.sh하지만 테스트 를 실행 하면 wrapper.sh실패합니다(예상대로).

$ ./wrapper.sh 
if this has been started in its own group the following will pass
 PPID  PGID COMMAND
 2224  2224 bash ./main.sh
$ echo $?
1

하지만 터미널에서 직접 실행할 때와 같이 자체 그룹에서 실행 되도록 하거나 wrapper.sh에 무엇을 넣어야 합니까 ?main.shmain.sh

(실제로 차이가 있으면 ./main.sh &실행 하고 싶지만 wrapper.sh이 실험에서는 포그라운드에서 실행하는 것이 더 쉽습니다.)

(저는 우분투 18을 사용하고 있습니다)

답변1

Bash를 사용한다고 가정하면 명령줄에서 사용 set -m하거나 "감시 모드"(작업 제어)를 활성화하는 것이 간단한 대답입니다.-m

매뉴얼 페이지에서:

-m 모니터 모드. 작업 제어가 활성화되었습니다. 이 옵션은 이를 지원하는 시스템의 대화형 셸에 대해 기본적으로 활성화되어 있습니다(위의 작업 제어 참조). 모든 프로세스는 별도의 프로세스 그룹에서 실행됩니다. 백그라운드 작업이 완료되면 셸은 종료 상태를 포함하는 줄을 인쇄합니다.

$ bash -m wrapper.sh 
if this has been started in its own group the following will pass
 PPID  PGID COMMAND
12630 12631 bash ./main.sh
12631
12631
12631
passed

그러나 "이유"에 대한 질문은 매우 엄격하며 비대화형 쉘에서 모니터 모드가 기본적으로 비활성화되어 있는 이유가 있을 수 있으므로 YMMV가 있습니다.

답변2

setsid프로세스에 대한 새 세션을 생성하여 프로세스 그룹 리더로 만드는 .

man 1 setsid및 을 참조하십시오 man 2 setsid.

관련 정보