저는 현재 대규모 플랫폼에 대한 감사 스크립트를 작성 중입니다. 기본 스크립트에서는 트랩을 사용하고 트랩 중 하나에서는 사용자에게 파일을 정리하도록 요청합니다. 스크립트에는 표준 출력에 대한 출력이 없으므로 bg에서 스크립트를 실행하는 것이 분명합니다.
fg
SIGQUIT를 bg-job으로 보내면 중지되며 프롬프트를 얻으 려면 수동으로 포그라운드로 가져와야 합니다 .
내가 시도한 것:set -m
능동적인 직업 통제를 시도해보고 그것을 fg
내 트랩 기능에 넣었습니다.
스크립트가 완료되면 쉘이 닫히고 스크립트 set -m
가 없으면 스크립트에 작업 제어가 없다는 디버그 출력이 표시됩니다. 을 사용해도 set -m
작업이 포그라운드로 나타나지 않습니다.
이를 위해 내 질문은 다음과 같습니다.
- 특정 순간에 작업을 강제로 전면에 표시할 수 있나요?
- 나는 이것이 스크립트에서 작업 제어를 사용하는 일반적인 방법이 아니라는 것을 알고 있습니다. 이에 대한 "모범 사례"는 무엇입니까?
- 스크립트 내의 작업 제어는 서브셸/하위 프로세스에 대해서만 작동합니까, 아니면 이를 사용하여 시작하는 작업을 제어할 수 있습니까?
편집하다:screen
lcd047이 제안한 것처럼 or 을 사용하는 것이 더 우아 tmux
하고 스크립트를 깨끗하고 단순하게 유지합니다.
답변1
스크립트 내의 작업 제어는 서브셸/하위 프로세스에 대해서만 작동합니까, 아니면 이를 사용하여 시작하는 작업을 제어할 수 있습니까?
예. 작업 제어는 상위 셸에 의해 수행되므로 그 내부에서 하위 프로세스를 포그라운드로 가져올 수 없습니다.
편집하다:하지만 여전히 다음과 같이 할 수 있습니다.
아래첨자:
#! /bin/sh ... trap "kill -s USR1 $PPID" TTOU ... echo -n Cleanup? read yn </dev/tty ...
상위 스크립트:
#! /bin/sh ... trap "fg %1" USR1 ... child & ... wait ...
그러면 SIGTTOU
자식에 하나의 신호 처리기가 설치되고 SIGUSR1
부모에 다른 신호 처리기가 설치됩니다. 하위 프로세스가 터미널에 무언가를 출력하려고 하면 를 수신 SIGTTOU
한 다음 SIGUSR1
상위로 전송하고 상위 프로세스가 실행되어 fg %1
하위 프로세스를 전경으로 가져옵니다.
위의 내용은 %1
자식 프로세스라고 가정합니다. 실제로 어쨌든 백그라운드에 프로세스가 있을 수 있습니다.