개발 창고/Server

[Linux] How to run in the background and foreground

로이제로 2023. 11. 10. 22:00
반응형

 

How to run in the background and foreground

 리눅스에서 프로그램을 명령어를 실행하는 방법에는 크게 백그라운드와 포그라운드로 나눠집니다. 일반적으로 우리가 명령을 실행하여 결과를 보는 방법이 포그라운드입니다.

 만약 아래와 같이 nginx에 접근하는 request에 대해서 모니터링을 한다고 가정하고 실행하면 명령어를 실행한 사용자는 단순히 해당 화면을 보고만 있어야 합니다.

$> sudo tail -f /var/log/nginx/access.log

nginx에 접근한 access 로그를 foreground로 확인

 위 와 같이 access로그를 tail을 통해 확인하는 경우 실시간으로 확인이 되지만, 이와 동시에 다른 작업을 병행해서 수행할 수 없습니다. 만약 이 명령을 백 그라운드에서 실행하려면 어떻게 해야 할까요?

Foreground를 Background로 만드는 방법

1/ [CTRL] + [z]를 눌러 Foreground작업을 멈춤

2/ bg명령을 통해 Background로 전환

3/ jobs 명령을 통해 해당 작업 확인

Foreground에서 작동 중인 tail을 background로 전환

 실제로 이 명령은 조금 무의미하긴 합니다. 왜냐하면, 현재 tail은 별도의 작업이 없기 때문에 console에서 출력하면서 nginx 로그를 보기 위함이기 때문입니다. 하지만 현재 시점부터 쌓일 access log에 쌓일 내용을 /data/log/check.log에 쌓고 싶다면 아래와 같이 tail 결과를 써줄 수 있습니다.

$> sudo tail -f /var/log/nginx/access.log > /data/log/check.log

tail 데이터가 foreground에서 /data/log/check.log에 쌓이고 있음

 위와 같이 입력하면, 내용이 콘솔 창이 아닌 /data/log/check.log에 쌓이게 됩니다. 또한 이는 foreground에서 실행되기 때문에 동시에 다른 foreground를 실행할 수 없는 상태이며 위에서처럼 background로 보낸 후 /data/log/check.log에 쌓였는지 확인해 보면 실제로 쌓인 내용을 확인할 수 있습니다.

# 작업 멈춤
[CTRL] + [z]

# /data/log/check.log 확인
$> cat /data/log/check.log

실제로 쌓이고 있는지 현재 foreground작업을 멈추고 확인

 여기에서 주목할만한 건 [CTRL] + [z] 이후 작업이 처음과 달리 [2]가 되었다는 겁니다. 이를 job를 통해 확인해 보면 아래와 같습니다.

jobs를 통해 확인한 실행 상태

 1번은 bg로 전환하였기 때문에 background에서 running 중이고, 2번 작업은 [CTRL] + [z]로 멈춰둔 상태이기 Stopped라고 뜹니다. 이 상태에서 2번 작업을 background로 전환한 후 job을 확인해 보면 아래와 같이 변경되었음을 알 수 있습니다.

2번 작업을 backgorund작업으로 변경 후 jobs를 확인한 결과

여기에서 jobs의 각 항목의 내용은 아래와 같습니다

순번 항목 내용
1 작업 번호 현재 작업들의 번호로, background 또는 foreground로 전환하거나 중지된 작업을 실행하고 싶을 때 해당 번호를 가지고 처리하게 됩니다.
2 작업 기호 + : fg나 bg 명령에 작업 번호를 지정하지 않으면 default로 지정되는 작업을 표시합니다.
- : +가 붙은 작업이 끝난 이후 다음 default 작업이 됩니다.
3 작업 상태 Stopped : [CTRL] + [z]를 누르거나 [CTRL] + [c]와 같이 명령 중 인터럽트에 의해 작업이 중지 또는 대기 상태의 작업을 의미합니다.
Running : 작업이 실행 중임을 의미합니다.
Done : 작업이 정상적으로 완료되었음을 의미합니다.

 

Background를 Foreground로 만드는 방법

 위에서 두 개의 작업을 Background로 전환했습니다. 이 중 첫 번째 Console에 표시되던 tail을 다시 foreground로 가져오고 싶다면 아래와 같은 순서로 실행하면 됩니다.

# foreground로 가져올 작업의 번호를 체크
$> jobs

# 해당 작업을 foreground로 전환
$> fg %1

jobs를 통해 foreground로 보낼 작업을 확인 후 foreground로 작업을 전환 한 결과

 먼저 jobs를 통해 foreground로 보낼 작업을 확인한 후 해당 작업의 맨 첫 번째 항목의 번호를 가져온 후 foreground로 전환해 주면, 위와 같이 어떤 작업이 foreground로 전환되었는지 보이며 작업이 실행됩니다.

 이때, jobs의 +/- 기호에서 설명한 것처럼 별도의 명령 없이 아래와 같이 호출하면

$> fg

[+] 기호가 붙어있던 2번 작업이 foreground로 전환되게 됩니다.

 

바로 백그라운드로 실행하는 방법

위에서 jobs별로 확인하다 보면 아래의 빨간색 영역에서 조금 특이한 점을 발견하는데

1번 작업에만 &가 붙음
1번과 2번 작업 모두에 &가 붙음

 바로 작업 끝에 &가 붙어있는 것을 확인할 수 있습니다. 이는 &가 바로 background에서 작업 중임을 의미하기도 하거니와 실행 시에 뒤에 &를 붙여주면 바로 background로 작업됨을 의미합니다.

 만약 아래와 같이 tail 명령을 /data/log/background.log에 쌓는다고 가정하고 뒤에 &를 붙여주면 이전과 다르게 foreground작업이 아닌 바로 background 작업으로 실행되었음을 확인할 수 있습니다.

$> sudo tail -f /var/log/nginx/access.log > /data/log/background.log &

background로 실행된 3번 작업

 위처럼 3번 작업이 foreground 없이 바로 background로 전환되었음을 알 수 있습니다.

 

확장 내용

1/ 로그아웃 또는 터미널창이 닫혀도 실행되기 하고 싶은 경우

$> nohup 명령어

 만약 tail의 작업이 /data/log/check.log에 내가 로그아웃하거나 터미널창을 닫은 후에도 작업되도록 하고 싶다면 아래와 같이 호출하면 됩니다.

$> nohup sudo tail -f /var/log/nginx/access.log > /data/log/check.log

 

2/ 화면 출력내용이나 에러 내용을 파일로도 화면으로도 남기고 싶지 않다면

$> 명령어 > /dev/null 2>&1 &

명령어에 대한 일반 출력을 /dev/null로 보내서 없애 버리고, 에러 로그(2) 또한 1번으로 전달하므로 /dev/null로 전달하도록 합니다. 그리고 이는 터미널에서도 출력될 필요가 없으므로, Foreground가 아닌 Background에서 실행되도록 &를 추가해 줍니다.

3/ 화면 출력 내용은 a.log, 에러 출력 내용은 a.err 파일에 저장하기

$> 명령어 > a.log 2> a.err &
반응형

'개발 창고 > Server' 카테고리의 다른 글

[Linux] How to set up FTP and view logs  (2) 2023.11.11
[Linux] How to set up samba  (1) 2023.11.11
[Linux] How to use the Signal  (0) 2023.11.10
[Linux] How to use "ss" command  (0) 2023.11.09
[Linux] How to use "arp" command  (2) 2023.11.09