bg 명령의 이상한 동작

bg 명령의 이상한 동작

프로세스(애플리케이션)가 항상 터미널에 대한 입력을 예상하고 항상 uart에서 stdout으로 수신된 데이터를 보내는 경우 프로세스(애플리케이션)를 백그라운드로 보내는 방법은 무엇입니까?

CTRL+Z 및 bg %number / bg %%를 사용하여 내 앱을 백그라운드로 보낼 수 없습니다.

어떤 아이디어라도 있습니까? 무슨 일이 일어나고 있나요?

내 장치(프로그램)가 백그라운드로 전송되기 전에 구성하려면 터미널의 일부 입력 명령이 필요합니다. 백그라운드로 보내려고 하면 오류가 발생합니다.

# [CTRL-Z]
[1]+  Stopped                 sudo ./my_app

# bg %1

그것은 나에게 다음과 같은 것을 보여줍니다 :

[1]+  Stopped                 sudo ./my_app

답변1

백그라운드에서 실행 중인 프로그램이 터미널에서 데이터를 읽으려고 하면SIGTTIN 신호에 의해 중지됨. 입력이 현재 포그라운드 프로세스에 들어가고 있습니다. 입력이 포그라운드 또는 백그라운드 프로세스에 무작위로 들어가면 중단될 수 있습니다. 따라서 백그라운드 프로그램은 포그라운드로 가져올 때까지 일시 중지됩니다.

처음에만 프로그램에 데이터를 전달해야 한다면 데이터를 프로그램에 파이프하세요.

echo "config=foo" | ./my_app &

때때로 프로그램과 상호 작용해야 하지만 대부분의 경우 무인 실행을 계속할 수 있는 경우 터미널 멀티플렉서에서 실행하십시오.화면또는멀티플렉서. 화면을 예로 들어보겠습니다.

screen -S my_app ./my_app

필요한 입력을 입력하고 Ctrl+를 눌러 A스크린 세션을 분리합니다. 즉, 백그라운드에서 실행 중인 채로 두고 원래 터미널로 돌아갑니다. 프로그램과 다시 상호작용하려면 screen 세션에 다시 연결하세요.

screen -S my_app -rd

복잡한 상호작용을 자동화해야 한다면 다음을 작성하세요.예상되는스크립트(또는 유사한 라이브러리가 있는 다른 언어로 된 스크립트).

¹프로세스 그룹이지만 여기서는 세부적으로 다루지 않겠습니다.

답변2

명령이 tty에서 계속 읽는 경우 다음을 호출해야 합니다.

fg

"중지됨" 메시지를 받은 후 예상되는 입력을 입력합니다.

답변3

stdin이 계속 작동하므로 인수를 stdin에 전달하면 안 되나요? CTRL-Z만 누르면 백그라운드에서 입력을 기다립니다.

예를 들어

$ cat test.sh
#!/bin/bash

read var
echo $var

$ cat <<EOF > input
d
EOF

$ ./test.sh < input
d

$ ./test.sh <input > stdout 2> stderr &
[2] 23180
[2]-  Done                    ./test.sh < input > stdout 2> stderr

$ cat stdout
d

입력을 전달하지 않고 실행하려고 할 때:

$ ./test.sh > stdout 2> stderr &
[2] 13012

[2]+  Stopped                 ./test.sh > stdout 2> stderr

관련 정보