쉘에서 차단 프로세스 실행 후 다른 프로세스 호출

쉘에서 차단 프로세스 실행 후 다른 프로세스 호출

본질적으로 차단되는 프로세스가 있습니다. 먼저 실행됩니다. 두 번째 프로세스를 실행하기 위해 첫 번째 프로세스를 백그라운드로 이동시키고 두 번째 프로세스를 실행합니다. wait 문을 사용하여 터미널에서 기다립니다. 그런데 쉘을 종료한 후( CTRL+를 누름 C) 첫 번째 프로세스가 원활하게 종료되지 않는 것 같습니다 . 쉘 스크립트는 다음과 같습니다.

실행.sh

#!/bin/sh

# start process one in background
python3 -m http.server 8086 & 

# start second process
firefox "http://localhost:8086/index.html"
 
wait

비슷한 질문을 찾았습니다여기하지만 제대로 작동하지 않는 것 같습니다. 기본적으로 두 번째로 전화하면 ./execute.sh서버에서 "주소가 이미 사용 중입니다"라고 말합니다. 이는 서버가 정상적으로 종료될 수 없음을 의미합니다. 반면, 터미널에서 서버를 수동으로 실행하면 원활하게 종료됩니다.

답변1

ctrl+c를 눌렀을 때 프로세스가 종료되도록 인터럽트를 캡처할 수도 있습니다.

#!/bin/sh

trap ctrl_c INT

ctrl_c () {
    kill "$bpid"
    exit
}

# start process one in background
python3 -m http.server 8086 &
bpid=$!

# start second process
firefox "http://localhost:8086/index.html"
 
wait

답변2

Firefox가 종료된 후 Python 프로그램을 종료합니다.

내 머리 꼭대기에서 :

#!/bin/sh

# start process one in background
python3 -m http.server 8086 & 
pid=$!

# start second process
firefox "http://localhost:8086/index.html"

kill "$!"
wait         # wait for it to actually exit
             # if it ignores SIGTERM, this'll hang

또는 스크립트에서 시작된 Firefox 프로세스가 실제로 포그라운드에서 실행되지 않기 때문에 firefox작동하지 않습니다 (단, 기존 프로세스에 새 창을 열도록 신호를 보낼 수도 있음).

하지만 사용자 입력을 기다릴 수 있습니다.

#!/bin/sh

# start process one in background
python3 -m http.server 8086 & 
pid=$!

# start second process
firefox "http://localhost:8086/index.html"

echo "Started Python HTTP server"
echo "Press enter to close it"
read tmp

echo "Asking the Python HTTP server to terminate"

kill "$!"
wait         # wait for it to actually exit
             # if it ignores SIGTERM, this'll hang

echo "Done."

또 다른 해결책은 Python HTTP 서버에 유휴 타이머를 구현하는 것입니다. N분마다 깨어나게 하고, 마지막 요청 이후 M분 이상이 지났는지 확인하고, 그렇다면 종료합니다. M을 너무 짧게 만들지 마십시오. 그렇지 않으면 짧은 휴식을 취하면 죽을 것입니다.

관련 정보