프로그램이 있는데, 그것을 이라고 부르자 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
배경으로 다시 놓을 수 있습니다.