백그라운드에서 실행하는 방법은 간단합니다.
스크립트를 실행할 때 뒤에 & 기호만 붙여주면 됩니다.
$ ./test1 &
[1] 585188
대괄호 안의 숫자는 작업 번호입니다.
뒤의 숫자는 프로세스 ID(PID)입니다.
PID는 프로세스마다 고유값을 가집니다.
프로세스가 완료되면 작업 번호, Done, 실행 명령이 표시됩니다.
[1]+ Done ./test1
백그라운드로 스크립트를 실행하면 STDOUT, STDERR 파일 디스크립터는 모니터로 여전히 출력됩니다.
모니터로 스크립트의 출력이 이루어지는 와중에 다른 명령어 실행이 가능합니다.
언뜻 보면 편리해보이지만 다른 명령어의 결과값과 함께 겹치게 되면 내용이 뒤섞여 알아보기가 힘듭니다.
$ Line #1
Line #2
Line #3
lsLine #4
'=' csvtosql output.txt states test1 users.csv
'~' 환경_변수.md result test test2 users.sql
$ Line #5
2 - Line #1
2 - Line #2
2 - Line #3
2 - Line #4
2 - Line #5
따라서, 백그라운드로 스크립트를 실행할 경우에는 STDOUT, STDERR를 리다이렉션 하는 것이 좋습니다.
스크립트는 백그라운드로 여러 개를 실행시킬 수 있습니다.
$ ./test1 &
[1] 585486
$ ./test2 &
[2] 585490
$ ./test3 &
[3] 585495
각 스크립트마다 작업 번호와 PID가 부여됩니다.
ps 명령어로 프로세스 리스트를 살펴보면,
$ ps
PID TTY TIME CMD
583315 pts/0 00:00:00 bash
585531 pts/0 00:00:00 test1
585533 pts/0 00:00:00 test2
585538 pts/0 00:00:00 test3
585542 pts/0 00:00:00 sleep
585543 pts/0 00:00:00 sleep
585546 pts/0 00:00:00 sleep
585547 pts/0 00:00:00 ps
TTY 필드의 값이 pts/0로 나타난 것을 볼 수 있습니다.
이는 각 백그라운드 프로세스가 터미널 세션(pts/0)에 연결되어 있다는 의미인데,
다른 말로 터미널 세션이 종료되면 백그라운드 프로세스 역시 종료된다는 의미입니다.
따라서, 콘솔로부터 로그오프한 후에도 백그라운드에서 스크립트가 계속 실행되게 하려면 다른 작업이 필요합니다.
-> 다음 절에서 살펴봅시다.