다른 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.sh
main.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
.