目录
概况
liunx服务器上有很多细节需要注意 ,这些细节很重要而且是 模版状,称为服务器规范
比如
- 服务器程序一般在后台运行,又称为守护进程,没有控制终端,因此,不会意外收到用户输入,它们的父进程一般是init进程 PID为1的进程
- liunx服务器程序一般以非root权限运行,而且有自己的运行账户,比如mysql,apache 和syslog等
- liunx服务器程序是可配置的,通常有很多命令行选项,可以针对不同的情况采取不同的措施,这些程序一般有自己的配置文件,配置文件一般放在/etc目录下面
- liunx服务器启动的时候会生成一个PID文件存入 /var/run目录下面 以记录后台进程的PID 比如syslog的pid文件是/var/run/syslogd.pid
- 服务器程序需要考虑系统资源和限制 ,预测自身能承受多大符合,比如进程可用文件描述符总数和内存总量.
liunx日志
liunx系统日志
服务器的调试和维护都需要一个专业的日志系统,liunx提供一个守护进程来处理日志 ---syslogd
现在liunx用到的都是他的升级版 --- rsyslogd
rsyslogd 既能接受用户日志 也能接受内核日志 用户调用syslog来将信息输出到本地UNIX域中的socket类型的文件/dev/log rsyslog则监听该文件以获取 用户进程的输出。
在老系统上内核日志是通过守护进程rklogd来管理的。 rsyslogd利用额外的模块来实现了相同的功能。内核日志由printk等函数打印到内核的环状缓存中 环状缓存中的内容直接映射到/proc/kmsg文件中. rsyslogd则通过读取该文件获得内核日志。
rsyslogd守护进程收到用户进程或者内核输入的日志后 会输出到指定的日志文件中,这些都是可以配置的
- 默认情况下调试信息回报错在/var/log/debug文件,普通信息报错在/var/log/messages文件 内核消息保存在/var/log/kern.log文件
- 日志系统如何分发可以在/etc/rsyslog.conf中。主要可以设置的项包括,内核日志输出路径,是否接受UDP日志及监听端口(默认514 在、/ect/services文件),是否接受TCP日志及监听端口,日志文件的权限,包含那些子配置文件(/etc/rsyslog.d/*.conf) 这些配置文件指定各类日志的目标存储文件
一图概括
syslog函数
应用程序采用syslog函数和rsyslogd守护进程通信,定义如下
第一个参数是日志级别
第二个可变参数 用于输出具体日志内容
日志级别如下
openlog 可以改变syslog默认输出方式 ,进一步结构化
- ident 将被添加到日志消息的日期和时间之后 常被设置为程序的名称
- logopt参数对后续syslog调用的行为进行配置 下面为可取值
-facility参数可用来修改syslog函数中的默认设施值
还可以通过设置日志掩码 来保证发布的程序不会出现大量的日志日志级别大于日志掩码的日志信息将会被忽略
maskpri 指定日志掩码值 返回该进程之前的日志掩码值
调用完后日志 需要通过下面函数关闭日志
用户信息
大部分服务器以root身份启动,但不能以root的身份运行。这关乎用户信息的安全性。
下面函数可以获取和设置当前进程的真实用户,有效用户,真实组,有效组。
一个进程有两个用户ID:UID 和EUID。
EUID存在的目的是为了方便资源访问:让运行程序的用户拥有有效用户的权限
任何用户都能用su程序来修改自己的账号信息 ,因为su程序的有效用户是root,可以访问到/etc/passwd文件 su程序被设置成了set-user-id.
任何运行su程序的普通用户都能访问/etc/passwd文件。有效用户为root的进程被称为特权进程
进程间的关系
liunx下面的每一个进程 有自己的pid 也有进程组ID(PGID)
通过下面函数获取指定进程的PGID
成功返回进程所属PGID,失败则返回-1 并设置errno
设置PGID
该函数将PID为pid的进程PGID设置为pgid,如果pid和pgid相同,则把pid对应的进程设置为进程组首领。如果pid为0 ,则表示当前进程的PGID 为pgid 如果pgid为0 ,则使用pid作为目标PGID。setgid函数成功时返回0,失败则返回-1并设置erron
注意:一个进程只能设置自己或者其子进程的PGID ,并且,当子进程调用exec相关函数后,
我们不能再在父进程中它设置PGID
会话
一些有关联的进程组将会形成一个会话,下面函数用于创建一个会话
该函数如果由进程组的首领调用的话 会产生一个错误,对于非组首领进程,调用该函数不仅会创建新会话,而且有以下效果
- 调用进程会成为会话的首领 ,此时该进程是新会话的唯一成员.
- 新建的一个进程组 ,其PGID就是调用进程的PID 调用进程称为了该组的首领
- 调用进程将甩开终端
该函数调用成功将返回新的进程组PGID 失败返回-1 并设置errno
liunx进程并未提供所谓的会话ID的概念,但liunx系统认为它等于会话首领所在的进程组PGID
并提供了如下函数来读取SID
ps命令查看进程关系
系统资源限制
待补充
改变工作目录和根目录
待补充
服务器程序后台话
待补充