Bash 스크립트에서 프로세스를 분리하는 방법은 무엇입니까?

Bash 스크립트에서 프로세스를 분리하는 방법은 무엇입니까?

스크립트를 종료할 때 SIGINT가 프로세스로 전달되지 않도록 bash 스크립트에서 프로세스를 분리하려고 합니다.

disown터미널에서 직접 명령을 사용했지만 bash에서는 disownSIGINT가 전달되는 것을 막지 못했습니다. 이 스크립트의 목적은 단일 호출로 openocd를 시작한 다음 gdb를 시작하는 것입니다. 스크립트가 종료되지 않기 때문에(gdb를 실행 중임) SIGINT는 여전히 gdb에서 openocd로 전달됩니다. 이는 SIGINT가 gdb에서 일시 중지 명령으로 사용되기 때문에 문제가 됩니다.

터미널에서는 다음과 같습니다.

$ openocd &    # run openocd demonized
$ disown $!    # disown last pid
$ gdb          # invoke GDB

이 순서로 터미널에서 호출되면 SIGINT가 gdb에서 openocd로 전달되지 않습니다. 그러나 동일한 호출이 bash 스크립트에 있는 경우 SIGINT가 전달됩니다.

어떤 도움이라도 대단히 감사하겠습니다.

ps 이 문제는 OS X에서 발생하지만 모든 Unix 도구에도 이식 가능한 도구를 사용하려고 합니다.

답변1

Bash 스크립트에서 프로세스를 분리하려면 다음 안내를 따르세요.

nohup ./process &

예를 들어, (ctrl+c) 를 사용하여 bash 스크립트를 중지하거나 SIGINT셸이 종료되면 SIGHUP프로세스는 중단되지 않고 정상적으로 계속 실행됩니다. stdout&는 stderr로그 파일로 리디렉션됩니다: nohup.out.

독립형 명령을 실행하는 동안 터미널에서 출력을 보려면 다음을 사용하십시오 tail.

TEMP_LOG_FILE=tmp.log
> "$TEMP_LOG_FILE"
nohup ./process &> "$TEMP_LOG_FILE" & tail -f "$TEMP_LOG_FILE" &

답변2

나한테는 거부하기 딱 좋은데

command & disown

답변3

내가 찾은 해결책은 Annon Inglorion이 작성하고 그의 웹사이트에서 다운로드할 수 있는 "detach"라는 프로그램과 관련되어 있습니다.웹사이트

컴파일한 후에는 다음과 같은 스크립트에서 사용할 수 있습니다.

$ ./detach -p debug.pid openocd <args> # detach openocd
$ gdb <args>                           # run gdb
$ kill -9 $(cat debug.pid)             # end openocd process
$ rm debug.pid                         # remove file containing process id

첫 번째 줄은 새 프로세스(openocd 실행)를 생성하고 나중에 사용할 수 있도록 프로세스 ID를 파일(debug.pid)에 저장합니다. 이렇게 하면 Oliver의 답변에 제공된 pid에 대한 grep 문제가 방지됩니다. 다음 차단 프로그램(gdb) 종료 시 pid가 저장되어 있는 파일을 이용하여 분리된 프로세스를 직접 종료한다.

답변4

백그라운드에서 정상적으로 실행되는 프로세스, disown, nohup 등은 일반적으로 하위 프로세스가 SIGINT와 같은 일부 신호로 인해 종료되기 때문에 100% 정상적으로 실행되지 않습니다. 당신이 해야 할 일은 다른 프로세스 그룹을 사용하는 것입니다:

#!/bin/bash

(set -m; child_process &)

while [ true ]; do
   sleep 30
done

disown/nohup/whatever를 사용하는 것과 달리 CTRL-C와 하위 프로세스는 계속 실행됩니다.

관련 정보