服务是向外提供服务的进程,一般来说都会放在后台,不应该和终端关联
1.1 服务工作过程 提供服务的一端叫服务端,服务启动时需要监听对应的端口号 请求服务的一端叫客户端,客户端指定服务端的IP地址加端口号向服务端发起请求 服务端收到客户端的请求后分析数据包发现请求的端口是XX端口,内核根据哪个进程监听此端口将数据包发给对应的进程处理。处理完后将数据返回给客户端 1.2 常见的tcp/ip协议 软件用户接口分类 CLI(命令行界面) GUI(图形用户界面) ftp 文件传输协议 tcp 20,21 ssh tcp 22 telnet tcp 23 smtp tcp 25 dns tcp/udp 53 dhcp udp 67,68 http tcp 80 mysql tcp 3306 https tcp 443 redis tcp 6379 1.3 Linux服务分类 1.3.1 独立守护进程 独立守护进程是自行监听在后台的,基本所有服务都是独立守护类进程的服务 centos6上,独立守护进程的管理脚本都是sys V风格,放置在/etc/rc.d/init.d目录 1.3.2 超级守护进程 超级守护进程专指xinetd,xinetd本身是一个常驻内存的独立守护进程,它要监听来自外界对其管理的服务的请求。 xinetd进程管理服务 临时守护进程(telnet,rsync等)受两个配置文件的控制,一个是/etc/xinetd.conf提供的默认配置,一个是/etc/xinetd.d下针对某个服务的配置 临时守护进程的配置/etc/xinetd.d/rsyncservice rsync
{
disable = no
yes不启动,no启用
flags= IPv6
socket_type = stream
tcp类型套接字
wait = no
单线程还是多线程,no多线程
user = root
服务进程执行者
server = /usr/bin/rsync
服务进程路径
server_args = --daemon
服务进程运行时参数
log_on_failure += USERID
连接失败记录日志,并添加USERID
bind = ip_addr
监听地址
interface = ip_addr
同bind
}
2.管理服务
2.1 Systemd
2.1.1 systemd概述
systemd即为system daemon,是linux下的一种init软件,由Lennart Poettering带头开发,并在LGPL 2.1及其后续版本许可证下开源发布,开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果,最终代替现在常用的System V与BSD风格init程序。
systemd是一个专用于 Linux 操作系统的系统与服务管理器。当作为启动进程(PID=1)运行时,它将作为初始化系统运行,也就是启动并维护各种用户空间的服务。
为了与传统的 SysV 兼容,如果将 systemd 以 init 名称启动,并且"PID≠1",那么它将执行 telinit 命令并将所有命令行参数原封不动的传递过去。 这样对于普通的登录会话来说,无论是调用 init 还是调用 telinit 都是等价的。
当作为系统实例运行时,systemd将会按照system.conf配置文件以及system.conf.d配置目录中的指令工作;当作为用户实例运行时,systemd 将会按照user.conf配置文件 以及 user.conf.d配置目录中的指令工作。
systemd将各种系统启动和运行相关的对象,表示为各种不同类型的单元(unit),并提供了处理不同单元之间依赖关系的能力。大部分单元都静态的定义在单元文件中,但是有少部分单元则是动态自动生成的:其中一部分来自于其他传统的配置文件(为了兼容性),而另一部分则动态的来自于系统状态或可编程的运行时状态。单元既可以处于活动(active)状态,也可以处于停止(inactive)状态,当然也可以处于启动中(activating)或停止中(deactivating)的状态。还有一个特殊的失败(failed)状态,意思是单元以某种方式失败了(进程崩溃了、或者触碰启动频率限制、或者退出时返回了错误代码、或者遇到了操作超时之类的故障)。当进入失败(failed)状态时,导致故障的原因将被记录到日志中以方便日后排查。需要注意的是,不同的单元可能还会有各自不同的"子状态",但它们都被映射到上述五种状态之一。
systemd的优点是功能强大、使用方便,缺点是体系庞大、非常复杂。事实上,现在还有很多人反对使用systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反"keep simple, keep stupid"的Unix哲学。
单元配置文件包含有关以下项目的信息:服务、套接字、设备、安装点、自动安装点、交换文件或分区、启动目标、监控的文件系统路径、受 systemd 控制和监管的计时器、临时系统状态快照、资源管理部分或一组外部创建的进程
服务
进程相关信息(例如运行守护程序);文件以 .service 结尾
目标
用于将单元分组以及在启动期间用作同步点;文件以 .target 结尾
套接字
IPC 或网络套接字或文件系统 FIFO 相关信息,适用于基于套接字的激活(如 inetd);文件以 .socket 结尾
路径
用于触发其他单元(例如,在文件更改时运行服务);文件以 .path 结尾
计时器
受控制计时器相关信息,适用于基于计时器的激活;文件以 .timer 结尾
装入点
通常由 fstab 生成器自动生成;文件以 .mount 结尾
自动安装点
文件系统自动安装点相关信息;文件以 .automount 结尾
交换
内存分页的交换设备或文件相关信息;文件以 .swap 结尾
设备
sysfs/udev(7) 设备树中公开的设备相关信息;文件以 .device 结尾
范围/部分
有关分层管理一组进程的资源的概念;文件以 .scope/.slice 结尾
/usr/lib/systemd/system目录下查看
/usr/lib/systemd/system
/usr/lib/systemd/user
2.1.5 配置文件目录这三个目录是有优先级的,lib–>run–>etc,lib下的目录优先级最低,etc下的目录优先级最高;
当同一个内容出现在三个目录下时,优先级高的目录会覆盖优先级底的目录;
系统安装时,默认会将unit文件存放在/lib/systemd/system目录下;
/run/systemd/system这个目录一般是进程在运行时动态创建unit文件的目录;
/run/systemd/system目录一般很少修改,除非是修改程序运行时的一些参数即Session级别的,才在该目录下做修改;
[root@Master system]# cat nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
配置文件分为三部分,
[Unit]
Description:服务的简单描述
Documentation:服务文档
After=:依赖,仅当依赖的服务启动之后再启动自定义的服务单元
[Service]
Type : 启动类型simple、forking、oneshot、notify、dbus
Type=simple(默认值):systemd认为该服务将立即启动,服务进程不会fork;如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型; Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功;对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求, 使用此类型启动即可;使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程; Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务;可能需要同时设置 RemainAfterExit=yes使得systemd在服务进程退出之后仍然认为服务处于激活状态; Type=notify:与Type=simple相同,但约定服务会在就绪后向systemd发送一个信号,这一通知的实现由libsystemd-daemon.so提供; Type=dbus:若以此方式启动,当指定的BusName出现在DBus系统总线上时,systemd认为服务就绪;PIDFile:pid文件路径
ExecStartPre:启动前要做什么,上文中是测试配置文件-t
ExecStart:启动
ExecReload:重载
ExecStop:停止
PrivateTmp:True表示给服务分配独立的临时空间
[Install]
WantedBy:服务安装的用户模式,从字面上看,就是想要使用这个服务的有是谁;
上文中使用的是:multi-user.target ,就是指想要使用这个服务的目录是多用户; 每一个.target实际上是链接到我们单位文件的集合,当我们执行:systemctl enable nginx.service
就会在/etc/systemd/system/multi-user.target.wants/目录下新建一个/usr/lib/systemd/system/nginx.service文件的链接; 当执行该命令后,nginx服务会随着开机而启动;systemctl disable nginx.service
Removed symlink /etc/systemd/system/multi-user.target.wants/nginx.service. 该命令执行完成后会将/etc/systemd/system/multi-user.target.wants目录下的关于nginx.service的软连接取消; 2.1.8 系统管理相关命令systemctl是systemd的主命令,用于管理系统和服务
systemctl reboot
systemctl poweroff
systemctl halt
systemctl rescue
systemd-analyze命令用于查看启动耗时
systemd-analyze 查看系统启动耗时
systemd-analyze blame 查看每个服务的启动耗时
systemd-analyze critical-chain 显示瀑布状的系统启动过程流
2.1.9 systemd相关操作 自启动 systemctl enable nginx.service 禁止自启动 systemctl disable nginx.service 启动服务 systemctl start nginx.service 停止服务 systemctl stop nginx.service 重启服务 systemctl restart nginx.service 查看Unit定义文件 systemctl cat nginx.service 编辑Unit定义文件 systemctl edit nginx.service 重新加载Unit定义文件 systemctl reload nginx.service 列出已启动的所有unit,就是已经被加载到内存中 systemctl list-units 列出系统已经安装的所有unit,包括那些没有被加载到内存中的unit systemctl list-unit-files 查看服务的日志 journalctl -u nginx.service 还可以配合-b
一起使用,只查看自本次系统启动以来的日志
查看所有target下的unit systemctl list-unit-files --type=target
查看默认target,即默认的运行级别。对应于旧的runlevel
命令 systemctl get-default
设置默认的target systemctl set-default multi-user.target
查看某一target下的unit systemctl list-dependencies multi-user.target
切换target,不属于新target的unit都会被停止 systemctl isolate multi-user.target
systemctl poweroff >>>关机
systemctl reboot >>>重启
systemctl rescue >>>进入rescue模式
2.1.10 systemd初始化流程
systemctl start|stop|status|restart sshd.service
systemctl enable sshd.service
systemctl disable sshd.service
2.2 (centos6)chkconfig
需要init.d目录下有LSB风格的服务控制脚本
chkconfig --list #查看服务在不同运行级别是否开机启动
chkconfig SERVICE_NAME on|off #默认修改2,3,4,5
管理当前服务
1.通过服务控制脚本 /etc/init.d/NAME start|stop|restart|reload|status
2.通过service命令 service NAME start|stop…
systemctl start|stop|status|restart sshd.service 启动,关闭,状态,重启服务
systemctl enable sshd.service 开机启动
systemctl disable sshd.service 开机不启动
2.4 无服务控制脚本把服务进程放入rc.local使其开机自动运行
/usr/local/nginx/sbin/nginx
匡夆 原创文章 217获赞 54访问量 1万+ 关注 私信 展开阅读全文