作者 青鸟
会话与进程
命令行的典型使用方式是,打开一个终端窗口,在里面输入命令。用户与计算机的这种临时的交互,称为一次"会话"(session) 。
会话的一个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完。
这就带来一个问题,当我们运行后端程序时,我们的程序进程是和我们的会话绑定的。当我们退出命令行的时候,程序进程就难以管理,这就不符合我们对于后端程序进程的管理需求。于是就有了进程守护这一概念。
Tmux
什么是Tmux
tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权。使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机。
tmux可以将会话与窗口"解绑":窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候,再让会话"绑定"其他窗口。
于是乎,tmux就可以起到守护进程的作用。
tmux守护进程
新建会话
第一个启动的 Tmux 窗口,编号是0,第二个窗口的编号是1,以此类推。这些窗口对应的会话,就是 0 号会话、1 号会话。
使用编号区分会话,不太直观,更好的方法是为会话起名。
|
|
上面命令新建一个指定名称的会话。
###分离会话
在 Tmux 窗口中,按下Ctrl+b d
或者输入tmux detach
命令,就会将当前会话与窗口分离。
|
|
上面命令执行后,就会退出当前 Tmux 窗口,但是会话和里面的进程仍然在后台运行。
tmux ls命令可以查看当前所有的 Tmux 会话。
|
|
接入会话
tmux attach
命令用于重新接入某个已存在的会话。
|
|
杀死会话
tmux kill-session命令用于杀死某个会话。
|
|
切换会话
tmux switch
命令用于切换会话。
|
|
重命名会话
tmux rename-session
命令用于重命名会话。
|
|
上面命令将0号会话重命名。
会话快捷键
下面是一些会话相关的快捷键。
|
|
systemed
简介
Systemd是一个系统管理守护进程、工具和库的集合
很多时候在工作或者自己搭建服务的时候会遇到可能需要手动编写Systemed Service文件的情况。Systemed我们也常用来守护进程。这里对Service文件编写进行解析。
每个 Systemed Unit 都有对应的配置文件,它们分散在三个目录里。
/lib/systemd/system
:系统默认的单元文件
/etc/systemd/system
:用户安装的软件的单元文件
/usr/lib/systemd/system
:用户自己定义的单元文件
Service文件中包含三个区块,分别是[Unit]、[Service]、[Install],下面对每个区块及其内参数进行说明:
[Unit]描述信息
该区块用于指定服务名称、服务文档、启动顺序、服务依赖等
Description:用于指定服务名称。
Documentation:用于指定服务文档,非必须项。
After:用于指定当前服务需要在那些服务启动后启动。
Before:用于指定当前服务需要在那些服务启动前启动。
Wants:用于指定哪些服务对于当前服务弱依赖,指定服务没有运行,不会影响当前服务执行。
Requires:用于指定哪些服务对于当前服务强依赖,指定服务没有运行,当前服务会启动失败。
BindsTo:与Requires类似,不同之处在于,指定服务停止运行,会导致当前服务停止运行。
Conflicts:指定服务与当前服务互斥运行,即指定服务不能与当前服务同时运行。
[Service]启动信息
- Type:用于指定服务启动类型。
子项参数解析:
参数 | 作用 |
---|---|
simple(默认值) | ExecStart启动的进程为该服务主进程。 |
exec | 与simple类似,不同之处在于,只有在该服务的主进程执行完成之后,systemd才认为该服务启动完成。 其他后继单元必须一直阻塞到此时间后才能继续启动 |
forking | 以fork()方式启动,启动时父进程将会退出,子进程将成为主进程 |
oneshot | 与simple类似,不同之处在于,只有在该服务的主进程退出之后,systemd才认为该服务启动完成,才能开始启动后继单元 |
dbus | 类似于simple,区别在于会等待D-Bus信号后才启动 |
notify | 类似于simple,启动结束后会发出通知信号,然后systemd才会启动其他服务 |
idle | 类似于simple,区别是idle要等到其他任务都执行完,才会启动该服务 |
EnvironmentFile:用于指定当前服务的环境参数文件
ExecStart:用于指定服务启动需要执行的命令
ExecReload:用于指定服务重启需要执行的命令
ExecStop:用于指定服务停止需要执行的命令
ExecStartPre:用于指定服务启动前执行的命令。
ExecStartPost:用于指定服务启动后执行的命令。
ExecStopPost:用于指定服务停止后执行的命令。
PrivateTmp:用于设置服务启动时挂载私有的/tmp、/var/tmp目录,此行为的目的在于提高服务进程临时文件的安全性。
[Install] 安装信息
该区块用于指定服务的用户信息,此部分的参数只在systemctl enable和systemctl disable时生效。
WantedBy:一个或多个 Target,当前服务enable时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中。
RequiredBy:一个或多个 Target,当前服务enable时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中。
Alias:用于指定当前服务可用于启动的别名。
Also:用于指定当前服务enable时,会被同时enable的其他服务。
Target的含义是服务组,表示一组服务。WantedBy=multi-user.target
指的是,sshd 所在的 Target 即multi-user.target
。
这个设置非常重要,因为执行systemctl enable sshd.service
命令时,sshd.service
的一个符号链接,就会放在/etc/systemd/system
目录下面的multi-user.target.wants
子目录之中。
Systemd 有默认的启动 Target。
|
|
上面的结果表示,默认的启动 Target 是multi-user.target
。在这个组里的所有服务,都将开机启动。这就是为什么systemctl enable命令能设置开机启动的原因。
使用 Target 的时候,systemctl list-dependencies
命令和systemctl isolate
命令也很有用。
|
|
一般来说,常用的 Target 有两个:一个是multi-user.target
,表示多用户命令行状态;另一个是graphical.target
,表示图形用户状态,它依赖于multi-user.target
。
常见命令
|
|
Systemd日志管理
Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.conf
。对日志的的便捷管理也方便我们的运维工作。
常见用法如下:
|
|
一个非常好用的查看日志的手段
|
|
案例:编写unit文件,并注册到systemd服务中
首先编写shell脚本,执行vim start.sh
|
|
其次,创建unit文件
|
|
第三步,将我的unit文件注册到systemd中systemctl enable my.service
第四步,查看该服务的状态systemctl status my.service
参考文章: