什么是守护进程daemon

回到顶部

daemon是恶魔,守护神的意思!
linux系统后台运行着许多进程,这些进程提供某种特定服务(service),这些进程统称为守护进程(daemons)。
因为守护进程肯定会提供某种服务,服务通过进程的形式提供,所以往往将服务等同于守护进程。
我们通过ps、pstree和top等命令观察系统进程的时候,会看到有些进程名后面会有一个字符d,这很有可能就是一个守护进程,d就是daemon的意思。
字符d只是为了方便用户识别,并不是所有的系统守护进程名后面都有字符d.
Linux主机在开机启动后, 默认就会开启很多服务进程,常见的系统守护进程有打印服务,定时任务服务进程atd和crond、网络文件服务进程vsftpd、www服务进程httpd,邮件管理服务等等。

Unix操作系统后台运行着很多守护进程,执行不同的管理任务。
普通命令后加上&可以让进程在后台运行,但守护进程在启动的时候能自动进入后台。
守护进程在linux后台运行且不受任何终端控制。
守护进程没有控制终端,不会往终端输出任何信息,由终端输入的任何信号(例如中断信号)也不会影响到守护进程的运行。 守护进程通过Syslog函数输出信息,这些信息会被发送给syslogd守护进程。

对内核来讲,守护进程与普通进程没有区别。只是守护进程有一些自己独有的特性,将一个普通进程加上这些特性就可以改造成一个守护进程。
c程序员创建守护进程的编程步骤: linux守护进程创建步骤
守护进程最重要的特性是在后台运行,必须与前台环境完全隔离。 这些环境通常是从父进程(特别是shell)继承而来的,包括未关闭的文件描述符、控制终端、会话和进程组、工作目录以及文件创建掩码等。
守护进程可以在Linux系统启动时从启动脚本/etc/rc.d中启动,也可以由作业控制进程crond启动,还可以由用户终端(通常是shell)执行启动。

守护进程按照服务类型可以分为如下几类:

系统服务守护进程:syslogd、login、crond、at等;
网络服务守护进程:sendmail、httpd、xinetd等;
独立启动的守护进程:httpd、named、xinetd等;
被动守护进程(由xinetd启动):telnet、finger、ktalk等。

总结

回到顶部

早期的服务进程管理使用systemV机制,通过/etc/init.d/*, service, chkconfig, setup等命令管理服务进程进程的启动,关闭,默认开机启动等;
CentOS 7.x之后采用systemd机制,systemd可以并行启动服务进程,大大提高开机速度,并且只提供一个管理命令(systemctl).
systemd将服务定义为unit,unit又分类为service, socket, target, path, timer等不同的类别,方便管理与维护;
启动,关闭,重新启动的方式为: systemctl [start|stop|restart] unit.service;
设置默认开机启动的方式为: systemctl [enable|disable] unit.service;
查询系统所有启动的服务: systemctl list-units --type=service;
查询系统中所有的服务(含不启动): systemctl list-unit-files --type=service;
systemd取消了传统的runlevel概念,使用不同的target操作环境。常见操作环境为 multi-user.target与 graphical.target。
不重新启动切换不同的操作环境使用 systemctl isolate unit.target;
设置默认环境则使用 systemctl set-default unit.target
systemctl默认的配置文件放在/usr/lib/systemd/system,自行修改或设计的则建议放在/etc/systemd/system/目录下。
管理员可使用man systemd.unit, man systemd.service, man systemd.timer 查询 /etc/systemd/system/目录下配置文件的语法, 并使用 systemctl daemon-reload 加载后,才能自行撰写服务与管理服务!
除了atd与crond,还可以可以通过 systemd.timer 亦即 timers.target 的功能,来使用systemd的时间管理功能。
以sshd服务为例,了解daemon的管理机制.sshd服务没有修改过端口,我们开启第二个sshd服务,该服务的port端口为222:
1.查看sshd服务的状态:

              [root@initroot ~]# systemctl status sshd.service
              sshd.service - OpenSSH server daemon
              Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
              Active: active (running) since Thu 2015-08-13 14:31:12 CST; 20h ago
              [root@initroot ~]# cat /usr/lib/systemd/system/sshd.service
              [Unit]
              Description=OpenSSH server daemon
              After=network.target sshd-keygen.service
              Wants=sshd-keygen.service
              [Service]
              EnvironmentFile=/etc/sysconfig/sshd
              ExecStart=/usr/sbin/sshd -D $OPTIONS
              ExecReload=/bin/kill -HUP $MAINPID
              KillMode=process
              Restart=on-failure
              RestartSec=42s
              [Install]
              WantedBy=multi-user.target
            
2.通过man sshd可以查询到sshd的配置文件为/etc/ssh/sshd_config!再man sshd_config可以查到端口是使用Port来规范的! 我们创建第二个配置文件/etc/ssh/sshd2_config:
              [root@initroot ~]# cd /etc/ssh
              [root@initroot ssh]# cp sshd_config sshd2_config
              [root@initroot ssh]# vim sshd2_config
              Port 222
              可在文件的最后一行加入上面的内容
            
3.接下来修改启动脚本服务档:
              [root@initroot ~]# cd /etc/systemd/system
              [root@initroot system]# cp /usr/lib/systemd/system/sshd.service sshd2.service
              [root@initroot system]# vim sshd2.service
              [Unit]
              Description=OpenSSH server daemon 2
              After=network.target sshd-keygen.service
              Wants=sshd-keygen.service
              [Service]
              EnvironmentFile=/etc/sysconfig/sshd
              ExecStart=/usr/sbin/sshd -f /etc/ssh/sshd2_config -D $OPTIONS
              ExecReload=/bin/kill -HUP $MAINPID
              KillMode=process
              Restart=on-failure
              RestartSec=42s
              [Install]
              WantedBy=multi-user.target
              [root@initroot system]# systemctl daemon-reload
              [root@initroot system]# systemctl enable sshd2
              [root@initroot system]# systemctl start sshd2
              [root@initroot system]# tail -n 20 /var/log/messages
              # semanage port -a -t PORT_TYPE -p tcp 222
              where PORT_TYPE is one of the following: ssh_port_t, vnc_port_t, xserver_port_t.
            
可以看到上面这两句,也就是SELinux的端口问题!下面解决:
              [root@initroot system]# semanage port -a -t ssh_port_t -p tcp 222
              [root@initroot system]# systemctl start sshd2
              [root@initroot system]# netstat -tlnp | grep ssh
              tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1300/sshd
              tcp 0 0 0.0.0.0:222 0.0.0.0:* LISTEN 15275/sshd
              tcp6 0 0 :::22 :::* LISTEN 1300/sshd
              tcp6 0 0 :::222 :::* LISTEN 15275/sshd
            
netstat -tul 与 netstat -tunl 有什么区别:
使用 n 时, netstat不会显示主机名与服务名称 (hostname & service_name), 而是显示IP 及 port number。 IP 的分析与 /etc/hosts 及 /etc/resolv.conf 有关, port number 则与 /etc/services 有关;
找出启动 port 3306端口的服务:
搜寻 /etc/services文件可知port 3306 为 mysql启动的端口,mysql为一种网络数据库系统软件;
以下命令可查询目前系统默认开机会启动的服务:
systemctl list-units 以及 systemctl list-unit-files
使用 systemctl status [unit.service]查询服务的状态!

initroot编辑整理,转载请注明www.initroot.com