# Introduction to Linux Daemon
* Background Processes in Linux
* Linux Init Systems: systemd vs. System V
* Command `systemctl`: Managing System Services in Linux
## What is a Linux Daemon?
* **Definition**: A daemon is a background process that runs continuously and performs specific tasks or waits to perform specific tasks.
* **Origin**: The term "daemon" comes from Greek mythology, meaning a benevolent or benign nature spirit.
* Run in the background without user intervention.
* Often started at boot time and run continuously until the system is shut down.
* Do not have a controlling terminal.
* Perform system-level tasks such as logging, printing, and networking.
## How Daemons Work
* Examples
* `sshd`: Secure Shell Daemon, handles SSH connections.
* `httpd`: HTTP Daemon, serves web pages.
* `crond`: Daemon that executes scheduled tasks.
* `syslogd`: System logging daemon.
* Lifecycle:
* **Initialization**: Daemon is started, often during system boot.
* **Operation**: Daemon runs in the background, waiting for tasks or performing continuous operations.
* **Termination**: Daemon stops when the system shuts down or when manually stopped.
## Introduction to Init Systems
* Init systems are responsible for initializing the system during the boot process and managing services.
* They determine the startup and shutdown sequence of services and daemons in a Unix-like operating system.
* System V (SysV) v.s. systemd
## System V (SysV) Init
* Overview:
* One of the oldest init systems used in Unix-like operating systems.
* Characteristics:
* Based on runlevel scripts located in `/etc/init.d/` directory.
* Uses symbolic links in `/etc/rc*.d/` directories to start and stop services.
* Sequential execution of startup scripts.
* Pros:
* Simplicity and predictability in its approach.
* Easy to understand and configure manually.
* Cons:
* Can lead to longer boot times due to sequential execution.
* Relatively more challenging to manage complex dependencies between services.
## systemd
* Overview:
* Modern init system introduced as a replacement for System V init.
* Characteristics:
* Implements parallelization for service startup.
* Uses **unit files** for service configuration.
* **Units** are resources that systemd manages, including services, sockets, devices, etc.
* Service units: Represent system services.
* Socket units: Represent inter-process communication sockets.
* Target units: Represent system states or synchronization points.
* Offers features like service activation on demand, dependency management, logging, and monitoring.
* Pros:
* Faster boot times due to parallelization.
* Advanced dependency management.
* Built-in logging and monitoring capabilities.
* Cons:
* Some users find its complexity overwhelming, especially those accustomed to traditional Unix-like systems.
* Requires learning new concepts and commands.
## SysV Init vs. systemd
* Linux init systems play a crucial role in the boot process and service management.
* System V init and systemd are two prominent init systems with distinct approaches and features.
* Choice between them depends on factors like system requirements, familiarity, and distribution support.
| | SysV | systemd |
| -------- | -------- | -------- |
| Startup Time | Sequential | Parallel |
| Configuration | Scripts | Unit Files |
| Dependency Management | Manual | Automated |
|Logging and Monitoring| Externeal tools | Built-in |
|Adoption| Legacy systems | Modern distribution |
## What is systemctl?
* systemctl is a command-line utility for controlling the systemd system and service manager.
* It is used to manage system services, units, targets, sockets, and other objects controlled by systemd.
* systemctl can handle service dependencies automatically.
* When starting or stopping a service, systemctl ensures that dependent services are started or stopped accordingly.
## `systemctl` syntax
```
systemctl [OPTIONS] [COMMAND] [UNIT]
```
E.g., start a service: `sudo systemctl start {service-name}`
* Common Commands:
* `start`: start a service
* `stop`: stop a service
* `restart`: restart a service
* `reload`: reload configuration
* `enable`: enable a service to start on boot
* `disable`: disable a service from starting on boot
* `status`: show the status of a service
## Creating a Simple Daemon
* Write the daemon code (e.g., in C, Python, Bash).
* Ensure the code runs in the background.
* Handle signals (e.g., start, stop, reload).
* Implement logging for monitoring.
* Place the unit file in `/etc/systemd/system/`
* Enable the service `sudo systemctl enable mydaemon`
* Start the service `sudo systemctl start mydaemon`
* Check status `sudo systemctl status mydaemon`
## Creating a Simple Daemon - Backup Service (Bash)
* Run the service one time
* Service dependency: atd.service
**/backups/backup.sh**
```
#!/bin/bash
source="/etc /home /root /var/lib /var/spool/{cron,at,mail}"
target="/backups/backup-system-$(date +%Y-%m-%d).tar.gz"
[ ! -d /backups ] && mkdir /backups
tar -zcvf ${target} ${source} &> /backups/backup.log
```
**/etc/systemd/system/backup.service**
```
[Unit]
Description=backup my server
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c " echo /backups/backup.sh | at now"
[Install]
WantedBy=multi-user.target
```
**terminal**
```
[root@study ~]# chmod a+x /backups/backup.sh
[root@study ~]# systemctl daemon-reload
[root@study ~]# systemctl start backup.service
[root@study ~]# systemctl status backup.service
backup.service - backup my server
Loaded: loaded (/etc/systemd/system/backup.service; disabled)
Active: inactive (dead)
Aug 13 07:50:31 study systemd[1]: Starting backup my server...
Aug 13 07:50:31 study bash[20490]: job 8 at Thu Aug 13 07:50:00 2015
Aug 13 07:50:31 study systemd[1]: Started backup my server.
```
## Creating a Simple Daemon - Timestamp service (Python)
* Keep running in background
**/home/u/timestamp/timestamp.py**
```
#!/usr/bin/env python3
import time
import datetime
def main():
while True:
file1 = open("datedata.txt", "a")
file1.write(str(datetime.datetime.now())+" example \n")
print(str(datetime.datetime.now())+" example \n")
file1.close()
time.sleep(30)
if __name__ == "__main__":
main()
```
**/etc/systemd/system/timestamp.service**
```
[Unit]
Description="recording timestamp"
[Service]
Restart=always
WorkingDirectory=/home/u/timestamp
ExecStart=/usr/bin/python3 timestamp.py
[Install]
WantedBy=multi-user.target
```
## Reference
https://linux.vbird.org/linux_basic/centos7/0560daemons.php#systemd_cfg_custom
https://medium.com/@guemandeuhassler96/run-your-python-script-as-a-linux-daemon-9a82ed427c1a