102 lines
No EOL
5 KiB
Markdown
102 lines
No EOL
5 KiB
Markdown
# go-daemon
|
|
|
|
A Linux daemon runs continuously written in golang. Refer to [ahenk-docs/dev](https://git.aliberksandikci.com.tr/Liderahenk/ahenk-docs/src/branch/main/dev/resources.md#daemon-linux) for resources
|
|
|
|
This repo will be include two separate daemons. One of them is written with C language for understanding native daemon processes [c-daemon](c-daemon/) . Other one is written in go for implement same deamon concepts to go language and using with native performance [go-daemon](go-daemon/)
|
|
<br>
|
|
|
|
---
|
|
|
|
<br>
|
|
|
|
### C-Daemon
|
|
|
|
Dependencies `git, go, gcc`
|
|
|
|
Debian/Pardus
|
|
```bash
|
|
sudo apt install git golang-go gcc
|
|
```
|
|
|
|
How to **build** c-daemon + go processes:
|
|
```bash
|
|
git clone https://git.aliberksandikci.com.tr/liderahenk/go-daemon
|
|
cd go-daemon/
|
|
go build -o c-daemon/bin/ c-daemon/go-files/info.go
|
|
gcc -o c-daemon/bin/test c-daemon/daemon/test.c c-daemon/daemon/daemon.c
|
|
sudo ln -sv "$(pwd)"/c-daemon/bin/info /info
|
|
```
|
|
|
|
How to **start** c-daemon + go processes:
|
|
```bash
|
|
cd c-daemon/bin/
|
|
./test
|
|
```
|
|
|
|
|
|
|
|
<br>
|
|
|
|
---
|
|
|
|
<br>
|
|
|
|
<details><summary>Notes</summary>
|
|
|
|
### Summary - [MakeUseOf](https://www.makeuseof.com/create-daemons-on-linux/)
|
|
|
|
Usually daemons start on system startup and run continuously until the system shuts down. They do NOT send messages to the console or screen in any way.
|
|
|
|
It is not mandatory but daemon processes are usually named to end with the letter **d**
|
|
|
|
- Initial operations, such as reading configuration files or obtaining necessary system resources, must be performed before the process becomes a daemon
|
|
|
|
- A background running process is created with init as its parent process. For this purpose, a sub-process is forked from the init process first, and then the upper process is terminated with exit
|
|
|
|
- A new session should open by calling the setsid function, and the process should be disconnected from the terminal
|
|
|
|
- All open file descriptors inherited from the parent process are closed
|
|
|
|
- Standard input, output, and error messages are redirected to `/dev/null`
|
|
|
|
- The working directory of the process must change
|
|
|
|
The operating system groups processes into session and process groups. Each session consists of process groups.
|
|
|
|
Processes receive their inputs and send their outputs to **controlling terminal**. A controlling terminal is associated with only **one** session at a time
|
|
|
|
A session and process groups in it have identification (**ID**) numbers; these identification numbers are the process identification numbers (**PID**) of the session and process group leaders. A child process shares the same group as its parent process
|
|
|
|
<br>
|
|
|
|
#### Creating a Daemon Process
|
|
<sub>c-daemon</sub>
|
|
|
|
To create a demon process, we need a background process whose parent process is init. In the code [_daemon](https://git.aliberksandikci.com.tr/Liderahenk/go-daemon/src/commit/ca61ee4ac26ae3855d41581baba2b44dbabc0cd3/c-daemon/daemon.c#L10) creates a child process and then kils the parent process. In this case, our new process *will* be a subprocess of init and *will* continue to run in background!
|
|
|
|
After compiling our both c files (https://git.aliberksandikci.com.tr/Liderahenk/go-daemon/src/commit/21df9b77fac68aeae40b09df7f9f5e0135f31e0d/c-daemon/daemon.c, https://git.aliberksandikci.com.tr/Liderahenk/go-daemon/src/commit/21df9b77fac68aeae40b09df7f9f5e0135f31e0d/c-daemon/test.c) with command `gcc -o test test.c daemon.c` run code with `./test` and do NOT enter any other key.
|
|
|
|
Examine the status before _daemon starts with `ps -C test -o "pid ppid pgid sid tty stat command"` command and you will see PID, Parent PID, STAT and other useful info.
|
|
|
|
STAT field, you see that your process is running but waiting for an off-schedule event to occur which will cause it to run in the **foreground** (we don't want this in daemons)
|
|
|
|
| Abbreviation | Meaning |
|
|
| ------------ | ------- |
|
|
| `S` | Waiting asleep for an event to happen, `interruptible sleep (waiting for an event to complete)` |
|
|
| `T` | `stopped, either by a job control signal or because it is being traced.` |
|
|
| `s` | `is a session leader` |
|
|
| `l` | `is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)` |
|
|
| `+` | `is in the foreground process group`|
|
|
| `<` | `high-priority (not nice to other users)` |
|
|
|
|
run `man ps` for more info.
|
|
|
|
You will see that our process is now a member of the foreground process group `S+`. and parent process is probably a shell (bash,zsh,fish etc.) See parent process with command `ps -jp PPID` (replace PPID with parent process id you get above).
|
|
|
|
Now return to the terminal where you are running your application (./test) and press **Enter** to invoke the **_daemon** function. Then look at the process information on the other terminal again.
|
|
|
|
First of all, you can say that the new subprocess is running in the **background** since you do not see the **+** character in the **STAT** field. You can now see that the parent process of your process is the systemd process (or other init in use)
|
|
|
|
I'm too lazy to continue this readme(about c-daemon). just continue in [original website](https://www.makeuseof.com/create-daemons-on-linux/) or just review last versions of c files
|
|
|
|
</detailsc> |