본문 바로가기
컴퓨터/리눅스

프로세스 관련 명령어들

by adnoctum 2010. 9. 6.

   리눅스는 실행되고 있는 프로세스(프로그램)을 강제로 종료하는 것 이외에도, 프로세스를 잠시 멈추었다가 다시 실행시키는 것, background/foreground 의 전환 등이 가능하다. 그 중에서도 특히 jobs, fg, bg, top, kill, ps 등을 많이 사용하게 되는데, 이 글에서는 jobs, fg, bg 에 대해 간단히 알아 보자.

   프로그램을 실행시킬 때, background에서 실행되도록 하기 위해서는 명령줄의 가장 마지막에 ampersand (&) 를 붙여 주면 된다. 다음과 같다.
[adnoctum@bioism analysis_code]$ ./survival_analysis_with_random ../chip_data/GSE12093_2/GSE12093_2.group.config ./Responsiveness/Cancer/BreastCancer/random_gene_set_from_cluster.txt > ./Responsiveness/Cancer/BreastCancer/random_gene_set_from_cluster.txt.GSE12093_2.surv.analysis.txt &

좀 복잡한데, ./survival_analysis_with_random 이 실행 명령어이고 > 앞까지는 parameter이고, 그 뒤는 결과를 파일로 redirection 하고 있는 것이다. 그 가장 뒤에 & 를 붙임으로 해서 위의 명령을 background 에서 돌아 가게 하고 있다.

   jobs 는 현재 session 에서 실행된 명령들을 보여 준다. 다음과 같다.

전체 사진은 아래와 같다.

위의 경우, 현재 3개의 job이 진행 중인데, 그 중 1번과 3번은 잠시 멈춤 상태이고, 4번이 실행 중이다. 전체 사진을 보면 알 수 있듯이 4번 job 은 background 로 돌게 해 놓았다. 1번과 3번은 vim 을 이용하여 source code를 수정하고 있던 중이다. 이렇게 background/foreground 의 상태를 전환하기 위해서는 fg job_number 혹은 bg job_number 를 해주면 된다. 즉, 만약 다시 3번 job을 foreground로 돌리기 위해서는 - 즉 make_pathway_network.cpp 파일을 수정하던 상태로 돌아가기 위해서는 fg %3 을 해주면 된다. 즉,

fg jobspec

의 형식을 갖게 되는데, jobspec 은 위처럼 job에 할당된 번호를 % 뒤에 적어 주면 된다 - 보다 자세한 내용은 역시나 man page 참조. 위의 경우 2번 job 이 없는 이유는 실행이 모두 끝났기 때문이다. 위의 그림에서 보면 각 job의 숫자 옆에 -, + 표시가 있는데, + 표시가 current job 을 의미하며, fg 나 bg 는 parameter 없이 이 명령어만 쓰일 경우 + 로 표시된 job 에 그 명령어가 작동하게 된다.

만약 ampersand를 붙이지 않아서 foreground 에서 돌고 있는 프로그램을 background 로 돌리기 위해서는, 잠시 멈춤인 Ctrl + Z 를 누른 후, job 번호를 확인후 bg 명령어를 이용하면 된다. 오래 걸리는 작업의 경우, background 로 돌려 놓은 후, terminal 접속을 끊어도 프로세스는 계속 돌고 있다. 잘못해서 terminal 접속이 끊어지거나 할 수도 있으니 오래 걸리는 작업은 background로 돌려 놓는 것이 좋다.


너무 오래 걸리는 작업을 강제 종료시키거나 잠시 멈추어 놓았다가 나중에 다시 실행시키기 위해서는 kill 명령어를 사용한다. kill 명령어는

kill -s [SIGNAL] PID

형식인데, SIGNAL 의 종류는 여럿이 있으나 나의 경우 주로 SIGSTOP, SIGCONT 를 사용한다. 9 번 signal 은 SIGKILL이므로 프로그램을 강제로 종료시킬 때는 9 번 signal 을 주면 된다. PID는 ps 나 top 명령어를 실행시켰을 때 나타나는 프로세스 고유 ID 이므로 찾기 쉽다. top 을 이용하여 실제 예를 보자.


위는 top 명령어 이후, u adnoctum, c 를 누른 결과이다. survival_analysis_with_random 이 497 분째 실행중인 것을 알 수 있다. 또한 이 프로세스의 PID는 첫 번째 열에 나와 있듯이 14575 임을 알 수 있다. 이 프로세스를 잠시 멈추기 위해서,

[adnoctum@bioism analysis_code]$ kill -s SIGSTOP 14575

을 해준다. 그리고 다시 top 으로 프로세스의 상태를 살펴 보면,

위에서 보듯이 14575 process의 CPU 사용율이 0.0 이다. 즉, 멈추었다. 이제 이 프로세스를 다시 실행시키기 위해서
[adnoctum@bioism analysis_code]$ kill -s SIGCONT 14575

를 해주고, top 으로 상태를 확인해 보면,


다시 잘 돌고 있는 것을 확인할 수 있다. 만약 위의 경우, 14575 번 process를 강제종료하고자 했다면,
[adnoctum@bioism analysis_code]$ kill -9 14575

하면 되었을 것이다. 여기서 중요한 것 하나. kill 의 옵션 중 SIGNAL 은 번호나 signal 이름으로 줄 수 있는데, 만약 signal 이름을 잘못 주게 되면 프로세스가 강제 종료 된다. 즉, 프로그램 내부에서 signal 을 받아 처리할 때, undefined 된 signal 이 오면 비정상 종료를 하게 되므로, SIGSTOP 이나 SIGCONT 같은 이름을 '정확히' 써야 한다. 한 글자라도 틀리는 날에는... 며칠동안 돌아가던 프로그램이 비정상종료되는 슬픈 일이 발생할 수도 있다[각주:1].

   참고로, top 의 경우 돌고 있는 모든 프로세스가 나열되기 때문에 난 기본적으로 top 을 사용하는데, ps 명령어를 사용할 수도 있다. 아무런 parameter 없이 실행되면 ps 는 현재 세션에서 실행된 process만을 나열하므로, 만약 다른 세션에서 실행시킨 작업까지 보기 위해서는 -aux option 을 추가하면 된다.



  1. 난 그래서 오래 걸리는 작업의 경우, 프로그램이 비정상종료되는 것까지 고려하여, 실행시켰을 때 기존의 결과를 검사하여 이어서 작업할 수 있게끔 프로그래밍 하곤 한다. [본문으로]