Search
moon
sun

command line 환경에서의 job control

간단소개
출처에 있는 페이지를 번역했습니다
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Shell
signal
Scrap
태그
shell
job control
9 more properties

Job Control

때때로 실행되는 동안에 수행 중인 job을 중단해야하는 경우가 있다.
명령어를 실행했는데 너무 오래 걸리는 경우엔 Ctrl-C가 만사형통이긴 하다만,
이게 내부적으론 어떻게 실행되는 거고 왜 가끔은 실패하는거지? 🧐

killing a process

shell은 프로세스간의 정보를 전달하기 위해 Signal이라는 unix 메커니즘을 사용한다.
프로세스가 시그널을 받으면 프로세스의 진행을 잠시 멈추고 시그널을 처리한다.
이 처리 결과에 따라 프로세스의 실행 흐름이 달라질 수 있다.
따라서 시그널은 소프트웨어 인터럽트이다.
import signal, time def handler(signum, time): print("\nI got a SIGINT, but I am not stopping") signal.signal(signal.SIGINT, handler) i = 0 while True: time.sleep(.1) print("\r{}".format(i)) i += 1
Python
복사
Ctrl-C는 프로세스에 SIGINT를 전달한다.
위 예제 코드는 SIGINT를 무시하는 프로그램이며 실행 후 ctrl-c로 중단해보려 한 결과는 아래에!
보다시피 ctrl-c로 중단되지 않는다. 중단하려면 ctrl-\(SIGQUIT)
SIGINT와 SIGQUIT 둘 다 터미널 관련된 요청을 처리하긴 하지만, 프로세스를 종료하기 위한 더 일반적인 방법은 SIGTERM 신호이다.
SIGTERM 신호를 보내기 위해선 kill -TERM <PID>명령어를 사용한다.

pausing and backgrounding processes

시그널은 프로세스를 종료하는 것 외에도 쓰임새가 있다. SIGSTOP은 프로세스를 중단한다.
ctrl-z를 타이핑함으로써 터미널에 SIGTSTP(terminal stop)신호를 보낼 수 있다.
•
fg, bg 명령어를 통해 foregroup나 backgroud에 있는 중단된 작업을 수행할 수 있다.
•
jobs 명령어는 현재 터미널 세션에서 미완인 작업들을 보여준다.
•
% 심볼 뒤에 job number를 붙이면 해당 프로세스를 나타낼 수 있다.
•
$! 심볼을 통해 최신의 백그라운 작업을 나타낼 수 있다.
•
명령어 뒤에 &를 붙이면 작업을 백그라운드로 수행할 수 있다. → 하지만 여전히 쉘의 STDOUT을 사용하고 있음
이런 백그라운드 포르세스들 역시 터미널의 자식 프로세스이기 때문에 터미널을 닫으면 종료된다.
이를 막기 위해선
•
nohup 명령어를 사용하거나
•
이미 프로세스가 이미 시작된 경우 disown 명령어
•
혹은 terminal multiplexer를 사용!
$ sleep 1000 ^Z [1] + 18653 suspended sleep 1000 $ nohup sleep 2000 & [2] 18745 appending output to nohup.out $ jobs [1] + suspended sleep 1000 [2] - running nohup sleep 2000 $ bg %1 [1] - 18653 continued sleep 1000 $ jobs [1] - running sleep 1000 [2] + running nohup sleep 2000 $ kill -STOP %1 [1] + 18653 suspended (signal) sleep 1000 $ jobs [1] + suspended (signal) sleep 1000 [2] - running nohup sleep 2000 $ kill -SIGHUP %1 [1] + 18653 hangup sleep 1000 $ jobs [2] + running nohup sleep 2000 $ kill -SIGHUP %2 $ jobs [2] + running nohup sleep 2000 $ kill %2 [2] + 18745 terminated nohup sleep 2000 $ jobs
Shell
복사