일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ubuntu
- 트랜스포머
- 서보모터
- 오픈소스
- TRANSFORMER
- OpenAI
- 오블완
- 일론 머스크
- LORA
- 이미지 생성
- tts
- 확산 모델
- OpenCV
- PYTHON
- 생성형 AI
- 메타
- 시간적 일관성
- AI
- LLM
- 우분투
- 다국어 지원
- 가상환경
- 아두이노
- 딥러닝
- 티스토리챌린지
- 텍스트-이미지 생성
- AI 기술
- 오픈AI
- 인공지능
- ChatGPT
- Today
- Total
AI 탐구노트
[우분투] Bash에서 백그라운드 프로세스를 실행하고 종료하는 방법 본문
우분투 bash shell을 이용해 새로 생성한 스크립트를 백그라운드에서 동작시켜야 할 경우가 있습니다. 제 경우, 지난 번에 만든 썸네일 메이커 프로그램을 그런 식으로 백그라운드에서 동작시켜야 하는데요... .bashrc에 등록해 두고 사용하는데 대충 해 뒀더니 사용하면서 불편한 부분들이 많이 생겼습니다. 그래서, 약간 개선해야겠다 싶었죠.
그래서, 이번 글에서는 Bash를 이용해 백그라운드에서 작업을 실행하고 관리하는 다양한 방법을 알아 봤습니다. Bash 쉘에서 긴 시간 실행되는 작업을 실행하거나, 로그아웃 후에도 동작하도록 프로세스를 실행하고 싶을 때가 많은데 이를 위해 백그라운드 프로세스를 실행시키고 이를 종료시키는 방법을 알아두면 효율적으로 시스템을 관리할 수 있습니다. 특히, 개발자나 서버 관리자라면 이를 숙지하는 것이 필수적입니다. 이 글에서는 백그라운드 실행 방법과 종료 방법을 간단히 정리해 보겠습니다.
백그라운드 실행 방법
1. &를 사용한 기본 백그라운드 실행
명령어 끝에 &를 붙이면 해당 프로세스가 백그라운드에서 실행됩니다. 이 경우, 터미널이 열려 있는 동안에만 프로세스가 유지되며 터미널 종료와 함께 해당 프로세스도 종료됩니다.
$ ./script.sh &
2. nohup을 이용한 실행
nohup은 프로세스가 터미널 세션과 무관하게 계속 실행되도록 합니다. 원격에서 이용할 목적으로 서버 쪽에 프로세스를 띄워 놓을 때 많이 사용하는 방식입니다. 1번의 &만 이용하는 방법에서는 원격 접속을 끊는 순간 프로세스도 종료되는데 초보 때는 그런 실수를 많이 하죠.
$ nohup ./script.sh &
기본적으로 nohup.out 파일에 로그가 저장되는데 로그 파일을 별도로 지정하려면 다음과 같이 설정합니다.
$ nohup ./script.sh > output.log 2>&1 &
3. disown을 사용하여 현재 세션과 분리
disown은 이미 실행 중인 백그라운드 작업을 현재 셸 세션에서 분리해 터미널 종료 후에도 프로세스가 계속 실행되도록 할 수 있습니다. 하지만, 이렇게 할 바에는 그냥 nohup을 사용하는 것이 편하죠. 이 방식은 백그라운드로 작업을 시키다가 터미널 종료를 해야 하는데 프로세스는 계속 유지하고 싶을 때 선택하게 될 것 같습니다.
$ ./script.sh &
$ disown
4. tmux 또는 screen 세션 사용
세션 관리 툴을 사용하면 더 강력한 제어가 가능합니다. 아래 소개되는 tmux의 경우, 백그라운드 작업화를 떠나서 정말 다양한 작업을 수행할 수 있습니다. 프로세스 세션을 docker처럼 띄워두고 그 속으로 들어갔다 나왔다를 하면서 작업이 가능하죠. 제 경우, 동시에 몇개의 프로세스를 병렬로 띄워서 서로 간의 통신을 해야하는 데모를 만들 때 활용한 바 있습니다.
$ tmux new -s my_session
$ ./script.sh
tmux 사용 시 세션과 관련된 부분만 짧게 소개하면 다음과 같이 진행하면 됩니다.
- 세션 분리 : Ctrl+b, d
- 세션 재접속 :
$ tmux attach -t my_session
참고로 이미 아시는 분도 있겠지만, 안드로이드폰에서도 tmux 앱이 있습니다. 즉 폰에서도 스크립트를 구동시킬 수 있다는 얘기죠. 물론 이를 위해서는 약간의 작업들은 필요합니다.
프로세스 종료 방법
1. 프로세스 식별
ps 명령어로 실행 중인 프로세스 PID를 확인할 수 있습니다.
$ ps aux | grep "script.sh"
2. 프로세스 종료
이후 해당 PID를 kill 커맨드를 이용해 종료합니다.
$ kill -9 <PID>
3. pkill을 사용한 종료
PID를 식별하는 위의 과정을 거치지 않고, 바로 실행 중인 프로세스 이름으로 종료시키는 것은 pkill을 이용합니다. 단, 이 때 -f 옵션은 프로세스를 실행할 때 사용한 전체 명령어를 기준으로 검색하게 됩니다.
$ pkill -f "script.sh"
4. killall을 이용한 종료
killall을 이용하면 특정 이름을 가진 모든 프로세스를 종료시킬 수 있습니다.
$ killall script.sh
예제) 특정 명령어를 백그라운드에서 실행하고 종료하기
제 경우, .bashrc에 다음과 같이 thumb 함수를 정의해서 사용합니다. 그러면 터미널 어디서는 필요 시 실행시킬 수 있습니다. 로그인 시 자동으로 백그라운드에서 실행하도록 해 둬도 되는데 안 쓸 때는 괜한 CPU 부하를 줄 수도 있으니 필요할 때만 사용하도록 한 것이죠.
thumb(){
cd ~/coding/thumbnail_maker_py; nohup uvicorn main:app --reload > /dev/null 2>&1 &
}
이번에 개선한 부분은 .bashrc 파일에 해당 프로세스를 종료시키는 추가적인 alias를 두는 것이었습니다. 다음과 같이 말이죠.
alias killthumb="pkill -f 'uvicorn main:app --reload'"
시작할 때는 thumb, 종료 시에는 killthumb 이렇게 터미널 상에서 커맨드를 실행하면 됩니다.
추가 팁 : 로그 남기지 않기
shell 실행 시 로그를 남기지 않으려면 다음과 같이 리디렉션을 해 주면 됩니다.
$ nohup ./script.sh > /dev/null 2>&1 &
추가 팁 : 실행 중인 모든 프로세스 모니터링하기
실행 중인 모든 프로세스를 모니터링하려면 top 또는 htop을 사용하면 됩니다. 개인적으론 htop 추천!
$ htop
'기술 팁' 카테고리의 다른 글
OpenCV에서 화면에 한글 표시하기 (0) | 2025.01.08 |
---|---|
Windows 11의 WSL2에 Gnome Desktop, CUDA 설치 (0) | 2025.01.05 |
[우분투] VPN 연결 초간단 설정 (1) | 2025.01.04 |
[우분투] Chrome 브라우저 업데이트 (0) | 2025.01.03 |
[우분투] Wayland & X11 : Display Server 비교 및 전환하기 (2) | 2024.12.28 |