추가 읽기

추가 읽기

PR_SET_CHILD_SUBREAPER내 스크립트를 실행하는 Bash 프로세스에 대한 프로세스 플래그를 설정하여 해당 수명 동안 생성된 하위 프로세스의 트리를 얻을 수 있도록 하고 싶습니다 (순서 없는 방식으로 종료될 수 있음). 기본적으로 Bash가 자신을 호출할 수 있기를 원 prctl(PR_SET_CHILD_SUBREAPER, 1, 0, 0, 0);하지만 이를 달성할 방법을 찾지 못했습니다. 어떤 제안이 있으십니까?

Bash 내장 기능이 있는 경우 이를 사용하여 libc.so.6 prctl()직접 호출(Python과 같은)과 관련된 교활한 솔루션을 사용하더라도 괜찮습니다.ctypes

답변1

이것이 문제가 되지 않는다고 말씀하셨기 때문에 bash에 상응하는 기능을 도입해야 할 필요성을 느낍니다...

ctypes.sh, bash의 외부 기능 인터페이스

Bash 메커니즘을 로드하는 Bash 공유 객체 플러그인입니다 enable -f.

enable [-a] [-dnps] [-f filename] [name ...]

-f옵션은 동적 로딩을 지원하는 시스템의 공유 객체 파일 이름에서 새로운 내장 명령 이름을 로드하는 것을 의미합니다.

그리고 C언어로 구현했습니다. 최소한 대부분의 Linux 배포판과 FreeBSD에서 작동합니다.

당신은해야합니다컴파일 및 설치첫 번째. 주요 기능은 쉘에서 거의 모든 라이브러리 호출이나 시스템 호출을 사용할 수 있다는 것입니다. struct내장 함수가 구조를 자동으로 재구성할 수 없으면 구조가 필요한 호출이 더 복잡해질 수 있습니다 .

amd64(x86_64) 아키텍처 및 Linux 커널 5.6에서 현재 bash 셸에 입력된 예(일부 경우 상수는 아키텍처 및 (드물게) 커널 버전에 따라 다름):

$ source /usr/local/bin/ctypes.sh
$ dlcall -r int prctl int:36 ulong:1 ulong:0 ulong:0 ulong:0
int:0
$ echo $DLRETVAL # you can't use $() above to get the result since that would be a subshell
int:0
$ echo $$; bash -c 'echo $$; sleep 99 & echo $!; disown -a'
14767
16761
16762
$ pstree -p $$
bash(14767)─┬─pstree(16778)
            └─sleep(16762)

sleep상위 프로세스(pid 16761)를 잃은 프로세스는 bashinit 프로세스 대신 현재 쉘에 상속되었습니다. 작동했습니다.

이 시스템에 있는 값(및 유형) PR_SET_CHILD_SUBREAPER으로 바꿔야 합니다 ./usr/include/linux/prctl.h

#define PR_SET_CHILD_SUBREAPER    36

올바르게 사용하려면 설명서를 확인해야 합니다.

또한 쉘의 표준이 wait예상대로 작동하지 않을 수 있습니다. 쉘은 sleep명령을 생성하지 않으므로 wait명령은 아무 작업도 수행하지 않습니다. 당신은 dlcalling에 투자하고 싶을 수도 있습니다wait()bash 자체가 설정을 변경하고 명령이 실행될 때마다 -like를 호출하므로 이러한 상속된 프로세스에서 예상치 못한 상호 작용이 발생할 수 있기 때문에 이는 waitpid()어려울 수 있습니다 .wait()


사용데이터 베이스

이렇게 하면 이전과 동일한 결과를 얻을 수 있습니다(덜 장황하게 만들 수 있는 몇 가지 옵션이 있어야 함).

$ gdb -ex 'call (int)prctl((int)36,(long)1,(long)0,(long)0,(long)0)' -ex detach -ex quit -p $$

답변2

C 프로그래머가 아닌 경우 간단한 체인 로딩 도구를 사용할 수 있습니다. 나는 nosh 도구 세트를 위해 그러한 도구를 작성했습니다.

  • sh ./wibbleas (또는 다른 쉘)라는 스크립트의 경우 다음을 실행하십시오.
    로컬 리퍼 true sh ./wibble
  • ./wibble간단한 실행 스크립트 호출의 경우
    로컬 리퍼 true ./wibble

이 도구는 FreeBSD에서도 동일한 방식으로 작동합니다. 모든 시스템 호출 차이점을 숨깁니다.

추가 읽기

관련 정보