systemctl 로 서비스 시작, 중지 및 재시작
이 단계에서는 systemctl 명령을 사용하여 시스템 서비스의 수명 주기를 관리하는 방법을 배웁니다. 서비스를 시작, 중지 및 다시 시작하는 연습을 할 것입니다. 이 연습을 위해 생성할 더미 서비스를 사용합니다. 이 접근 방식은 중요한 시스템 기능에 영향을 주지 않고 안전하게 서비스를 조작할 수 있도록 합니다.
먼저 간단한 서비스 유닛 파일을 생성합니다. 이 파일은 몇 초마다 타임스탬프를 로그 파일에 쓰는 서비스를 정의합니다.
nano를 사용하여 systemd 시스템 디렉토리에 직접 mytest.service라는 새 서비스 유닛 파일을 생성합니다.
sudo nano /etc/systemd/system/mytest.service
nano 편집기에 다음 내용을 붙여넣습니다.
[Unit]
Description=My Test Service
After=network.target
[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do echo "$(date): My Test Service is running." >> /tmp/mytest.log; sleep 5; done'
ExecStop=/bin/bash -c 'echo "$(date): My Test Service stopped." >> /tmp/mytest.log'
Restart=on-failure
[Install]
WantedBy=multi-user.target
[Unit]: 유닛에 대한 일반 정보를 포함합니다. Description은 사람이 읽을 수 있는 이름을 제공하고, After=network.target은 이 서비스가 네트워크가 활성화된 후에 시작되어야 함을 지정합니다.
[Service]: 서비스의 동작을 정의합니다.
Type=simple: ExecStart 명령이 메인 프로세스인 간단한 서비스 유형을 나타냅니다.
ExecStart: 서비스가 시작될 때 실행할 명령입니다. 여기서는 5 초마다 타임스탬프가 찍힌 메시지를 /tmp/mytest.log에 쓰는 bash 루프입니다.
ExecStop: 서비스가 중지될 때 실행할 명령입니다. 로그에 중지 메시지를 씁니다.
Restart=on-failure: 서비스가 0 이 아닌 상태로 종료되면 서비스를 다시 시작하도록 구성합니다.
[Install]: 서비스가 설치되는 방법에 대한 정보를 포함합니다. WantedBy=multi-user.target은 시스템이 멀티유저 런레벨에 도달하면 이 서비스가 시작되어야 함을 의미합니다.
Ctrl+X를 누르고, Y를 눌러 확인한 다음, Enter를 눌러 파일을 저장하여 저장합니다.
이제 systemd 데몬을 다시 로드하여 새 서비스 파일을 인식하도록 합니다.
sudo systemctl daemon-reload
서비스 시작하기
서비스를 시작하려면 systemctl start 명령을 사용합니다.
mytest.service를 시작하려면 다음 명령을 실행합니다. systemctl 작업은 일반적으로 루트 권한이 필요하므로 sudo를 사용해야 합니다.
sudo systemctl start mytest.service
명령이 성공하면 즉시 출력은 없습니다.
이제 상태를 확인하여 서비스가 실행 중인지 확인합니다.
systemctl status mytest.service
서비스가 active (running)임을 나타내는 출력을 볼 수 있습니다.
● mytest.service - My Test Service
Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
Active: active (running) since ...
Main PID: ... (bash)
Tasks: 2 (limit: ...)
Memory: ...
CPU: ...
CGroup: /system.slice/mytest.service
├─... /bin/bash -c "while true; do echo \"\$(date): My Test Service is running.\" >> /tmp/mytest.log; sleep 5; done"
└─... sleep 5
...output omitted...
서비스가 메시지를 쓰고 있는지 확인하기 위해 로그 파일도 확인할 수 있습니다.
tail -f /tmp/mytest.log
5 초마다 다음과 유사한 새 줄이 나타나는 것을 볼 수 있습니다.
Tue Jul 22 09:15:09 AM CST 2025: My Test Service is running.
Tue Jul 22 09:15:14 AM CST 2025: My Test Service is running.
tail을 종료하려면 Ctrl+C를 누릅니다.
서비스 중지하기
실행 중인 서비스를 중지하려면 systemctl stop 명령을 사용합니다.
mytest.service를 중지하려면 다음 명령을 실행합니다.
sudo systemctl stop mytest.service
다시 말하지만, 즉시 출력은 없습니다.
서비스가 중지되었는지 확인합니다.
systemctl status mytest.service
출력은 이제 Active: inactive (dead)를 표시해야 합니다.
○ mytest.service - My Test Service
Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
Active: inactive (dead) since ...
...output omitted...
로그 파일 /tmp/mytest.log를 다시 확인합니다. "My Test Service stopped." 메시지가 표시되고 새로운 "running" 메시지가 나타나지 않아야 합니다.
tail /tmp/mytest.log
출력은 다음과 유사하게 표시됩니다.
Tue Jul 22 09:15:24 AM CST 2025: My Test Service is running.
Tue Jul 22 09:15:28 AM CST 2025: My Test Service stopped.
서비스 재시작하기
서비스를 다시 시작하려면 systemctl restart 명령을 사용합니다. 이 명령은 먼저 서비스를 중지한 다음 다시 시작합니다. 서비스 구성 변경 사항을 적용해야 할 때 유용합니다.
mytest.service를 다시 시작하려면 다음 명령을 실행합니다.
sudo systemctl restart mytest.service
서비스가 다시 실행 중인지 확인합니다.
systemctl status mytest.service
Active: active (running)이 다시 표시되어야 하며, Main PID는 새 프로세스가 시작되었음을 나타내는 새로운 숫자가 될 가능성이 높습니다.
● mytest.service - My Test Service
Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
Active: active (running) since ...
Main PID: ... (bash)
Tasks: 2 (limit: ...)
Memory: ...
CPU: ...
CGroup: /system.slice/mytest.service
├─... /bin/bash -c "while true; do echo \"\$(date): My Test Service is running.\" >> /tmp/mytest.log; sleep 5; done"
└─... sleep 5
...output omitted...
서비스가 "running" 메시지 쓰기를 재개했는지 확인하기 위해 로그 파일 /tmp/mytest.log를 확인합니다.
tail -f /tmp/mytest.log
"stopped" 메시지 다음에 새로운 "running" 메시지가 표시되어야 합니다.
Tue Jul 22 09:15:28 AM CST 2025: My Test Service stopped.
Tue Jul 22 09:15:40 AM CST 2025: My Test Service is running.
tail을 종료하려면 Ctrl+C를 누릅니다.