Systemd簡介

本文的主線 環境 => 服務=> 概念 => 目錄 => 體系

環境

vagrant up

pipenv run ansible-playbook playbooks/init.yml

pipenv run ansible-playbook playbooks/zsh.yml

pipenv run ansible-playbook playbooks/redis.yml
sudo apt install -y nginx

服務

ls -l /etc/systemd/system/multi-user.target.wants

cat /etc/systemd/system/multi-user.target.wants/nginx.service
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target
  • Description
systemctl list-units | grep nginx
# redis.service loaded active running A high performance web server and a reverse proxy server
  • After
man systemd.unit
# After=
# A space-separated list of unit names. Configures ordering dependencies between units
  • Type
man systemd.service
# Type=
# Configures the process start-up type for this service unit. One of simple, forking, oneshot, dbus, notify or idle
# If set to forking, it is expected that the process configured with ExecStart= will call fork() as part of its start-up
  • PIDFile
man systemd.service
# PIDFile=
# Takes an absolute path referring to the PID file of the service. Usage of this option is recommended for services where Type= is set to forking

ps -ef | grep nginx

cat /run/nginx.pid

grep pid /etc/nginx/nginx.conf
  • ExecStart & ExecStop
Linux Kernel
https://github.com/torvalds/linux/search?q=%22define+SIGTERM%22

SIGTERM vs SIGKILL: What's the Difference?
https://linuxhandbook.com/sigterm-vs-sigkill/#:~:text=Though%20both%20of%20these%20signals,cannot%20be%20handled%20or%20blocked.
  • TimeoutStopSec & Restart
cat /opt/services/redis/redis-server.pid

sudo killall redis-server

cat /opt/services/redis/redis-server.pid
  • Service Unit & Target Unit
systemctl list-units

systemctl list-units | wc -l

systemctl list-units --type=service

systemctl list-units --type=target

概念

ps -ef | head -n 2
# UID        PID  PPID  C STIME TTY          TIME CMD
# root         1     0  0 17:21 ?        00:00:01 /sbin/init
vim fork.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
    printf("start\n");

    pid_t pid;
    pid = fork();

    switch (pid)
    {
    case -1:
        return 1;

    case 0:
        printf("this is the child\n");
        break;

    default:
        printf("this is the parent\n");
        break;
    }

    printf("sleep\n");
    int m = 300;
    while (m--)
    {
        sleep(1);
    }

    return 0;
}
gcc fork.c -o fork

./fork &
# start
# this is the parent
# sleep
# this is the child
# sleep

ps -ef | grep fork
現在 過去
交互 service service
實現 systemctl init | systemv
手冊 man init man systemd
man systemd
# systemd is a system and service manager for Linux operating systems. When run as first process on boot (as PID 1), it acts as init system that brings up and maintains userspace services.
# For compatibility with SysV, if systemd is called as init and a PID that is not 1

目錄

ls -l /etc/systemd/system/multi-user.target.wants/nginx.service
# lrwxrwxrwx 1 root root 33 Jan 14 15:16 /etc/systemd/system/multi-user.target.wants/nginx.service -> /lib/systemd/system/nginx.service

sudo systemctl disable nginx.service

ls -l /etc/systemd/system/multi-user.target.wants/

sudo systemctl enable nginx.service

ls -l /etc/systemd/system/multi-user.target.wants/

體系

sudo journalctl
sudo journalctl -u nginx.service -f

timedatectl
timedatectl set-timezone Asia/Shanghai

hostnamectl

localectl

loginctl list-sessions
loginctl list-users

systemd-analyze blame

sudo systemctl reboot
sudo apt install -y apt-file

apt-file update

apt-file search timedatectl

apt-file search systemctl

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章