๋ฐ๋ชฌ(Deamon)์ด๋?
์ปดํจํฐ๊ฐ ๋ถํ ๋๋ ์๊ฐ๋ถํฐ ์๋ง์ ํ๋ก์ธ์ค๋ค์ด ์คํ๋ฉ๋๋ค. ps ๋ช ๋ น์ด๋ฅผ ํตํด ํ์ฌ ์คํ๋๊ณ ์๋ ํ๋ก์ธ์ค๋ฅผ ํ์ธํ ์ ์์ต๋๋ค(์๋์ฐ๋ ์์ ๊ด๋ฆฌ์). ์ค์ ๋ก ์คํ์ค์ธ ํ๋ก์ธ์ค๋ค์ ํ์ธํด๋ณด๋ฉด ์ฐ๋ฆฌ๊ฐ ์คํํ ํ๋ก์ธ์ค ์ธ์๋ ์ ์ ์๋ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ์คํ๋๊ณ ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๋ ๊ณต๊ฐ์์ ์คํ๋๋ ํ๋ก์ธ์ค๋ ํฌ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค(Foreground Process), ์ฌ์ฉ์๊ฐ ๋ณด์ง ๋ชปํ๋ ๊ณต๊ฐ์์ ์คํ๋๋ ํ๋ก์ธ์ค๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค(Background Process)๋ก ๋๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค ์ค์์๋ ์ฌ์ฉ์์ ์ง์ ์ํธ์์ฉํ ์ ์๋ ํ๋ก์ธ์ค๋ ์์ง๋ง ์ฌ์ฉ์์ ์ํธ์์ฉํ์ง ์๊ณ ๊ทธ์ ์ ํด์ง ์ผ๋ง ์ํํ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๋ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐ๋ชฌ(deamon)์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค(์๋์ฐ์์๋ ์๋น์ค(service)).
๋ฐ๋ชฌ(Daemon)์ ํน์ง
๋ฐ๋ชฌ์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ: ๋ฐ๋ชฌ์ ์ฃผ๋ก ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ผ๋ก ์ ์ดํ์ง ์๊ณ , ์์คํ
์ด ๋ถํ
๋ ๋ ์๋์ผ๋ก ์์๋์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋ฉ๋๋ค.
2. ์ฌ์ฉ์์ ์์ฒญ ์์ด ๋์: ์ฌ์ฉ์๊ฐ ๋ช
์์ ์ผ๋ก ๋ฐ๋ชฌ์ ์คํ์ํค์ง ์์ต๋๋ค. ๋์ , ์์คํ
๋ถํ
์ ๋๋ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์๋์ผ๋ก ์์๋ฉ๋๋ค.
3. ์์คํ
์๋น์ค ์ ๊ณต: ๋ฐ๋ชฌ์ ์์คํ
์๋น์ค๋ฅผ ์ ๊ณตํ๊ฑฐ๋ ํน์ ์์
์ ์ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์น ์๋ฒ ๋ฐ๋ชฌ์ ์น ํ์ด์ง๋ฅผ ์ ๊ณตํ๊ณ , ํ๋ฆฐํฐ ๋ฐ๋ชฌ์ ํ๋ฆฐํ
์๋น์ค๋ฅผ ์ ์ดํฉ๋๋ค.
4. ํ๋ก์ธ์ค ๊ด๋ฆฌ: ๋ฐ๋ชฌ์ ์์คํ
์ด ์คํ ์ค์ธ ํ๋ก์ธ์ค ์ค ํ๋๋ก์, ์ด์์ฒด์ ์ ์ํด ๊ด๋ฆฌ๋๊ณ ๊ฐ๋
๋ฉ๋๋ค. ์ด๋ ๋ฐ๋ชฌ์ด ์ข
๋ฃ๋์ง ์๋๋ก ํ๊ณ , ํ์ํ ๊ฒฝ์ฐ ๋ค์ ์์๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
5. ๋ก๊ทธ ๊ธฐ๋ก: ๋ฐ๋ชฌ์ ์ข
์ข
์์คํ
์ด๋ฒคํธ๋ ๋ฐ๋ชฌ ์์ฒด์ ๋์์ ๊ดํ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ์ด ๋ก๊ทธ๋ ์์คํ
๊ด๋ฆฌ์๊ฐ ์์คํ
๋์์ ๋ชจ๋ํฐ๋งํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
์๋ฅผ ๋ค์ด, ์น ์๋ฒ์์ ์ฌ์ฉ๋๋ "httpd" ๋ฐ๋ชฌ์ด ์์ต๋๋ค. ์ด ๋ฐ๋ชฌ์ ์น ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์น ํ์ด์ง๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์กํ๋ ์ญํ ์ ํฉ๋๋ค. ๋ํ, ์ด ๋ฐ๋ชฌ์ ์ฌ์ฉ์๊ฐ ๋ช
์์ ์ผ๋ก ์คํ์ํค์ง ์๊ณ , ์์คํ
์ด ๋ถํ
๋ ๋ ์๋์ผ๋ก ์์๋๋ฉฐ, ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ณ์ํด์ ๋์ํฉ๋๋ค.
๋ฐ๋ชฌ ํ๋ก์ธ์ค ๋ง๋ค์ด๋ณด๊ธฐ
C++์ ํตํด ๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
#include <iostream>
#include <fstream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
void write_log(const std::string& message) {
std::ofstream log_file("/tmp/daemon_example.log", std::ios::app);
if (log_file.is_open()) {
log_file << message << std::endl;
log_file.close();
}
}
int main() {
// ๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ
pid_t pid, sid;
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
if (pid > 0) {
exit(EXIT_SUCCESS);
}
// ์๋ก์ด ์ธ์
๋ฐ ํ๋ก์ธ์ค ๊ทธ๋ฃน์ ์์ํ์ฌ ๋ฐ๋ชฌ์ด ๋
๋ฆฝ์ ์ผ๋ก ์คํ๋๋๋ก ํจ
sid = setsid();
if (sid < 0) {
exit(EXIT_FAILURE);
}
// ๋ฐ๋ชฌ์ด ์คํ๋ ๊ฒฝ๋ก๋ก ์ด๋ (ํ์ํ ๊ฒฝ์ฐ)
chdir("/");
// ํ์ผ ๊ถํ ์ค์ (ํ์ํ ๊ฒฝ์ฐ)
umask(0);
// ๋ฐ๋ชฌ ๋์ ์์
while (true) {
// ๋ฐ๋ชฌ ๋ก๊ทธ ๋ฉ์์ง ๊ธฐ๋ก
write_log("Daemon is running...");
// ๋ฐ๋ชฌ์ด ์คํ๋ ์์
์ํ
// ...
// 5์ด ๋๊ธฐ
sleep(5);
}
return 0;
}
์ด ์ฝ๋๋ ๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ณ /tmp/daemon_example.log ํ์ผ์ ์ฃผ๊ธฐ์ ์ผ๋ก "Daemon is running..." ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ๋ฐ๋ชฌ์ ๋ฌดํ ๋ฃจํ๋ฅผ ์คํํ๋ฉฐ, ๊ฐ๊ฒฉ์ ๋๊ณ ์์
์ ์ํํ ์ ์์ต๋๋ค.
์ด ์ฝ๋๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐ๋ชฌ์ ๋์์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ๊ฐ๋จํ ์์ ์ด๋ฉฐ, ๋ ๋ณต์กํ ๋ฐ๋ชฌ์ ๋ ๋ง์ ๊ธฐ๋ฅ๊ณผ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค. ๋ํ, ๋ฐ๋ชฌ์ด ์คํ๋ ๋์ ๊ถํ, ๋ก๊น
๋ฐฉ๋ฒ, ์ค๋ฅ ์ฒ๋ฆฌ ๋ฑ์ ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
fork()์ exec()
์์ ๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค์ด๋ดค์ต๋๋ค. ์ฌ๊ธฐ์ ์ฐ์ด๋ ์์คํ ํธ์ถ์ fork()์ exec()์ ๋๋ค. ์ด ๋ ๊ฐ์ ์์คํ ํธ์ถ์ UNIX ์ด์์ฒด์ ์์คํ ์ ๊ทผ๊ฐ์ด ๋๋ ํธ์ถ๋ก์ initํ๋ก์ธ์ค๋ถํฐ ์์๋๋ ํ๋ก์ธ์ค ์ฒด์ธ์ ์์ฑํฉ๋๋ค. ํ ๋ง๋๋ก ์ด ์์คํ ํธ์ถ ์์ด๋ ์ด์์ฒด์ ๊ฐ ๋ง๋ค์ด์ง ์ ์์ต๋๋ค.
๋ค์ ํ๋ฒ ๊ฐ์กฐํ์ง๋ง fork์ exec๋ UNIX ๋ฐ UNIX ๊ณ์ด ์ด์์ฒด์ ์์ ์ฌ์ฉ๋๋ ์ค์ํ ์์คํ ํธ์ถ์ ๋๋ค. ์ด ๋ ์์คํ ํธ์ถ์ด ๋ฌด์์ด๊ณ ์ด๋ฅผ ํตํด ๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ์ดํดํด๋ณด๊ฒ ์ต๋๋ค.
1. fork() ์์คํ
ํธ์ถ:
fork() ์์คํ
ํธ์ถ์ ํ์ฌ ์คํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ๋ณต์ ํ์ฌ ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋, ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค๊ฐ ๋ชจ๋ ๋์ผํ ํ๋ก๊ทธ๋จ ์ฝ๋๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. fork() ํธ์ถ์ ๋ ๋ฒ ๋ฐํํฉ๋๋ค. ํ ๋ฒ์ ๋ถ๋ชจ ํ๋ก์ธ์ค์๊ฒ๋ ์์ ํ๋ก์ธ์ค์ PID(ํ๋ก์ธ์ค ์๋ณ์)๋ฅผ ๋ฐํํ๊ณ , ์์ ํ๋ก์ธ์ค์๊ฒ๋ 0์ ๋ฐํํฉ๋๋ค. ์คํจ ์์๋ -1์ ๋ฐํํฉ๋๋ค.
#include <unistd.h>
pid_t fork(void);
2. exec() ์์คํ
ํธ์ถ:
exec() ์์คํ
ํธ์ถ์ ํ์ฌ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์๋ก์ด ํ๋ก๊ทธ๋จ์ ๋ฎ์ด์๋๋ค. ์ด๋, ์๋ก์ด ํ๋ก๊ทธ๋จ์ ์ฝ๋, ๋ฐ์ดํฐ, ์คํ ๋ฑ์ด ํ์ฌ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋ฉ๋๋ค. ๋ฐ๋ผ์ fork()๋ก ์์ฑ๋ ์์ ํ๋ก์ธ์ค๋ exec()๋ฅผ ํตํด ์๋ก์ด ํ๋ก๊ทธ๋จ์ ์คํํ ์ ์์ต๋๋ค. exec() ํธ์ถ์ ์ฑ๊ณตํ๋ฉด ํธ์ถํ ํ๋ก์ธ์ค๊ฐ ์๋ก์ด ํ๋ก๊ทธ๋จ์ผ๋ก ๋์ฒด๋๊ธฐ ๋๋ฌธ์ ๋ฆฌํดํ์ง ์์ต๋๋ค. ์คํจ ์์๋ -1์ ๋ฐํํฉ๋๋ค.
#include <unistd.h>
int execvp(const char *file, char *const argv[]);
๋ฐ๋ชฌ ํ๋ก์ธ์ค ์์ฑ ์๋ฆฌ
1. fork() ํธ์ถ: ๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ถ๋ชจ ํ๋ก์ธ์ค๋ fork()๋ฅผ ํธ์ถํ์ฌ ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋, ๋ถ๋ชจ์ ์์์ ๋์ผํ ์ฝ๋๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
2. ๋ถ๋ชจ ํ๋ก์ธ์ค ์ข
๋ฃ: ๋ถ๋ชจ ํ๋ก์ธ์ค๋ fork()๋ฅผ ํตํด ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ ํ ์ข
๋ฃ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์์ ํ๋ก์ธ์ค๋ ๊ณ ์ ํ๋ก์ธ์ค(Orphan Process)๊ฐ ๋์ด init ํ๋ก์ธ์ค(์ผ๋ฐ์ ์ผ๋ก PID 1์ธ ํ๋ก์ธ์ค)๊ฐ ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ๋ฉ๋๋ค.
3. setsid() ํธ์ถ: ์์ ํ๋ก์ธ์ค๋ ์๋ก์ด ์ธ์
๋ฐ ํ๋ก์ธ์ค ๊ทธ๋ฃน์ ์์ํ๊ธฐ ์ํด setsid() ์์คํ
ํธ์ถ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ก์จ ๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ ๊ธฐ์กด์ ์ธ์
๋ฐ ํ๋ก์ธ์ค ๊ทธ๋ฃน๊ณผ ์์ ํ ๋
๋ฆฝ๋ ์๋ก์ด ์ธ์
๊ณผ ํ๋ก์ธ์ค ๊ทธ๋ฃน์ ๊ฐ๊ฒ ๋ฉ๋๋ค.
4. fork() ํธ์ถ(๋ ๋ฒ์งธ): ๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ ํ ๋ฒ ๋ fork()๋ฅผ ํธ์ถํ์ฌ ๋ ๋ฒ์งธ ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ ํ๋์ ์ธ์
๋ฆฌ๋(์ธ์
์ ์ฒซ ๋ฒ์งธ ํ๋ก์ธ์ค)๊ฐ ๋๋ฉฐ, ๋ ์ด์ ์ ์ด ํฐ๋ฏธ๋์ ๋ฌถ์ด์ง ์๊ฒ ๋ฉ๋๋ค.
5. ํ์ํ ๋ฆฌ์์ค ์ด๊ธฐํ: ๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ ํ์ํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ซ๊ณ , ์์
๋๋ ํฐ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ๊ณ , umask๋ฅผ ์ค์ ํ๋ ๋ฑ์ ์์
์ ์ํํ์ฌ ๋ฐ๋ชฌ์ด ๋
๋ฆฝ์ ์ผ๋ก ๋์ํ ์ ์๋๋ก ํ๊ฒฝ์ ์ค์ ํฉ๋๋ค.
6. exec() ํธ์ถ: ๋ฐ๋ชฌ ํ๋ก์ธ์ค๊ฐ ์ํ๋ ์์
์ ์ํํ ์๋ก์ด ํ๋ก๊ทธ๋จ์ exec()๋ฅผ ํตํด ์คํํฉ๋๋ค. ์๋ก์ด ํ๋ก๊ทธ๋จ์ ๋ฐ๋ชฌ์ ์ค์ง์ ์ธ ๋์์ ๋ด๋นํฉ๋๋ค.
์ด๋ฌํ ๋จ๊ณ๋ฅผ ํตํด ๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ ๋
๋ฆฝ์ ์ผ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๊ณ , ๋ถ๋ชจ ํ๋ก์ธ์ค์๋ ์์ ํ ๋ถ๋ฆฌ๋ ์ธ์
๊ณผ ํ๋ก์ธ์ค ๊ทธ๋ฃน์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ ํฐ๋ฏธ๋์ ์ํฅ์ ๋ฐ์ง ์๊ณ ์์ ์ ์ผ๋ก ๋์ํ ์ ์์ต๋๋ค.
'์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
CPU ์ค์ผ์ค๋ง ๊ฐ๋ ๊ณผ ์๊ณ ๋ฆฌ์ฆ (0) | 2023.11.05 |
---|---|
ํ๋ก์ธ์ค ๊ณ์ธต ๊ตฌ์กฐ (0) | 2023.10.31 |
์ด์ค๋ชจ๋(Dual Mode)์ ์์คํ ํธ์ถ(System Call) (0) | 2023.10.28 |
์ปค๋(Kernel)๊ณผ ์ธํฐํ์ด์ค(Interface) (0) | 2023.09.12 |
ํฐ๋ ธ์ด๋ง ๊ตฌ์กฐ๋? (0) | 2023.09.05 |
๋๊ธ