Difference between revisions of "Daemon linux"
From Teknologisk videncenter
m |
m |
||
(5 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | Example of creating a daemon in Linux: | + | |
+ | =Creating your own daemon= | ||
+ | <onlyinclude> | ||
+ | Example of creating a daemon in Linux: (See [[systemd debian]] for systemd daemons) | ||
*'''setsid()''' - damon will be the session leader. Sets Session ID (SID) and Group ID (GID) to Process ID (PID) | *'''setsid()''' - damon will be the session leader. Sets Session ID (SID) and Group ID (GID) to Process ID (PID) | ||
*Reopening stdin, stdout and stderr to /dev/null detaches the process from the controlling terminal and Parent PID is set to 1 (init or systemd - depending on Linux version/distribution) | *Reopening stdin, stdout and stderr to /dev/null detaches the process from the controlling terminal and Parent PID is set to 1 (init or systemd - depending on Linux version/distribution) | ||
Line 46: | Line 49: | ||
</source> | </source> | ||
===Checking the daemon=== | ===Checking the daemon=== | ||
+ | *Daemon detached from TTY - PPID is 1 | ||
+ | * Session and session group leader - SID and PGID same as PID | ||
<source lang=bash> | <source lang=bash> | ||
$ ps xo uname,pid,ppid,pgid,sid,tty,comm | grep -P '(my_daemon|COMMAND)' | $ ps xo uname,pid,ppid,pgid,sid,tty,comm | grep -P '(my_daemon|COMMAND)' | ||
USER PID PPID PGID SID TTY COMMAND | USER PID PPID PGID SID TTY COMMAND | ||
heth 778254 1 778254 778254 ? my_daemon | heth 778254 1 778254 778254 ? my_daemon | ||
− | + | $ tail -f /var/log/sysg | |
+ | Dec 20 12:37:59 emb3 my_daemon: Countet to 2 | ||
+ | Dec 20 12:38:01 emb3 my_daemon: Countet to 3 | ||
+ | Dec 20 12:38:03 emb3 my_daemon: Countet to 4 | ||
+ | Dec 20 12:38:05 emb3 my_daemon: Countet to 5 | ||
+ | ... | ||
</source> | </source> | ||
+ | </onlyinclude> | ||
[[Category:Linux]] | [[Category:Linux]] |
Latest revision as of 05:07, 22 December 2022
Creating your own daemon
Example of creating a daemon in Linux: (See systemd debian for systemd daemons)
- setsid() - damon will be the session leader. Sets Session ID (SID) and Group ID (GID) to Process ID (PID)
- Reopening stdin, stdout and stderr to /dev/null detaches the process from the controlling terminal and Parent PID is set to 1 (init or systemd - depending on Linux version/distribution)
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <syslog.h>
5 void daemon_create(void);
6
7 int main(void) {
8 printf("Starting my_daemon\n");
9 openlog("my_daemon", LOG_INFO, LOG_DAEMON);
10 daemon_create();
11 for (int i=0; i < 100; i++) {
12 syslog(LOG_INFO,"Countet to %d", i);
13 sleep(2);
14 }
15 return(0);
16 }
17
18 void daemon_create(void) {
19 pid_t pid;
20
21 pid = fork();
22 if(pid < 0){
23 syslog(LOG_ERR, "Error in fork: %m");
24 exit(1);
25 }
26 if(pid > 0) {
27 syslog(LOG_INFO, "Parent dying");
28 exit(0); // Parent die
29 }
30 if(setsid() < 0){ // Make child session leader
31 syslog(LOG_ERR, "Error in setsid: %m");
32 exit(2);
33 }
34 if (freopen("/dev/null", "r", stdin) == NULL
35 || freopen("/dev/null", "w", stdout) == NULL
36 || freopen("/dev/null", "w", stderr) == NULL ) {
37 syslog(LOG_ERR, "When creating daemon freopen from STDIN/OUT/ERR failed: %m");
38 exit(3);
39 }
40 }
Checking the daemon
- Daemon detached from TTY - PPID is 1
- Session and session group leader - SID and PGID same as PID
$ ps xo uname,pid,ppid,pgid,sid,tty,comm | grep -P '(my_daemon|COMMAND)'
USER PID PPID PGID SID TTY COMMAND
heth 778254 1 778254 778254 ? my_daemon
$ tail -f /var/log/sysg
Dec 20 12:37:59 emb3 my_daemon: Countet to 2
Dec 20 12:38:01 emb3 my_daemon: Countet to 3
Dec 20 12:38:03 emb3 my_daemon: Countet to 4
Dec 20 12:38:05 emb3 my_daemon: Countet to 5
...