중간 단계에서 Ctrl+C를 보낸 후에도 명령 시퀀스를 계속 실행할 수 있습니까?

중간 단계에서 Ctrl+C를 보낸 후에도 명령 시퀀스를 계속 실행할 수 있습니까?

프로그램이 있는데, 그것을 이라고 부르자 xcommand. 실행되면 표준 출력이 없지만 출력을 파일에 씁니다.

내가 달성하고 싶은 것은 실행 후 xcommand실행 프로세스 중에 실시간으로 출력을 보고 싶습니다. 예외가 발견되면 출력을 닫고 동시에 복원합니다 xcommand.

예를 들어 내가 작성한 bash 스크립트에서 여러 가지 방법을 시도했습니다.

xcommand &
tail -f outputfile
fg

그런데 문제는 을 누르면 ctrl+c모든 것이 멈춘다는 것입니다. 그리고 fg전혀 실행되지 않았습니다.

그럼 내가 원하는 효과를 얻을 수 있을까?

답변1

비대화형(예: 스크립트)인 경우 셸은 작업 제어를 수행하지 않습니다. 비동기 작업을 백그라운드에 두지 않습니다. 이들은 스크립트의 나머지 부분과 동일한 프로세스 그룹에 남아 있으므로 Ctrl-C를 누르면 SIGINT가 해당 프로세스 그룹으로 전송됩니다(스크립트 자체가 포그라운드에서 실행된다고 가정).

set -m쉘에 비대화형 작업 제어를 제공하는 명령을 실행할 수 있습니다 .

#! /bin/bash -
set -m
xcommand & # start as a background job, so won't receive SIGINT upon ^C
tail -f outputfile # start in foreground. Will receive SIGINT.
fg # bring the xcommand job in foreground and wait for it. Will receive SIGINT

작동하려면 스크립트가 전경에서 시작되어야 합니다. 또한 Ctrl-Z를 누르거나 백그라운드 작업이 터미널에서 데이터를 읽으려고 시도하는 경우 문제가 발생할 수 있습니다.

내 경험상 이 기술은"일하다"bash또는 에서는 yash일반적으로 다른 Bourne과 같은 쉘이 아닙니다.

답변2

백그라운드에서 프로그램을 시작하면

xcommand &

Ctrl+C껍질을 눌러서아니요멈추다.

네가 그렇게 하면

tail -f outputfile

Ctrl+C그런 다음 누르면 tail프로세스가 종료됩니다.

네가 그렇게 하면

fg

xcommand전경 에 배치하게 됩니다 . 이제 누르면 프로세스 Ctrl+C가 종료됩니다 xcommand.

따라서 프로세스를 전경으로 가져오지 마십시오 xcommand. 만약 그렇다면 누르고 Ctrl+Z따라가면 bg배경으로 다시 놓을 수 있습니다.

관련 정보