용량 100G 넘는 파일을 cp로 복사하는 명령어를 포그라운드로 실행하는 상황을 떠올려보자. 포그라운드 상태에서 쉘은 추가 입력을 받을 수 없기 때문에 복사 작업이 끝날 때까지 기다려야 한다.
그러나 프로세스를 백그라운드로 실행하면 작업이 진행되는 와중에도 쉘에서 다른 일을 할 수 있다.
이건 단순한 형태의 예시 상황이지만 백그라운드 실행은 여러모로 유용하다.
1. &
프로세스를 백그라운드로 실행하는 첫번째 방법은 끝에 & 를 붙이는 것이다.
용량이 1.3G 쯤 되는 zip 파일이 있다.
[root@newhost background]# ls -lh
total 1.3G
-rw-r--r--. 1 root root 1.3G Feb 27 22:55 test_file.zip
drwxr-xr-x. 2 root root 6 Feb 27 22:56 tmp_dir
이 파일을 tmp_dir 디렉토리에 복사하는 프로세스를 백그라운드로 실행하면
[root@newhost background]# cp test_file.zip ./tmp_dir &
[1] 3822
[root@newhost background]#
이렇게 프로세스의 PID를 출력하고 바로 쉘 입력창으로 돌아온다.
백그라운드 프로세스 현황을 보고 싶으면 jobs 명령어를 사용한다.
[root@newhost background]# jobs
[1]+ Done cp -i test_file.zip ./tmp_dir
입력한 명령이 완료(Done)된 것을 볼 수 있다.
2. Ctrl + z / bg
포그라운드로 실행한 프로세스를 백그라운드 프로세스로 바꿀 수도 있다.
명령을 실행하고 포그라운드 상태에서 ctrl + z 를 누르면 작업이 정지(pause)된다.
[root@newhost background]# cp test_file.zip tmp_dir/
^Z
[1]+ Stopped cp -i test_file.zip tmp_dir/
jobs 로 확인해봐도 상태가 Stopped 인 걸 볼 수 있다.
[root@newhost background]# jobs
[1]+ Stopped cp -i test_file.zip tmp_dir/
이때 해당 명령을 백그라운드로 실행하려면
bg %[job number]
와 같이 명령한다. jobs를 입력했을 때 맨 앞에 대괄호에 묶여 있는 숫자가 job number인데 백그라운드로 실행할 프로세스의 job number를 % 뒤에 입력한다.
[root@newhost background]# bg %1
[1]+ cp -i test_file.zip tmp_dir/ &
[root@newhost background]# jobs
[1]+ Running cp -i test_file.zip tmp_dir/ &
[root@newhost background]# jobs
[1]+ Done cp -i test_file.zip tmp_dir/
[root@newhost background]#
사실 이 경우 처럼 job이 1개 밖에 없으면 그냥 job number를 생략하고 bg만 입력해도 된다.
[root@newhost background]# cp test_file.zip tmp_dir/
^Z
[1]+ Stopped cp -i test_file.zip tmp_dir/
[root@newhost background]# bg
[1]+ cp -i test_file.zip tmp_dir/ &