当前位置:数据分析 > 运维人员必备的最全Linux服务器程序规范

运维人员必备的最全Linux服务器程序规范

  • 发布:2023-10-10 05:00

Linux服务器程序通常都有日志系统,至少可以将日志输出到文件中。一些高级服务器可以将日志输出到专用的UDP服务器。大多数后台进程在 /var/log 下都有自己的日志目录。 除了网络通信之外,服务器程序还必须考虑许多其他细节,零碎的,但基本上是模板式的。 Linux服务器程序一般在后台运行。后台程序也称为守护进程。它没有控制终端,因此不会意外地接受用户输入。守护进程的父进程一般是init进程(pid=1)。 Linux服务器程序通常都有一个日志系统,至少可以将日志输出到文件中。一些高级服务器可以将日志输出到专用的UDP服务器。大多数后台进程在 /var/log 下都有自己的日志目录。 Linux服务器程序通常以专用的非root身份运行。 mysqld、httpd、syslogd等后台进程分别有自己的运行账户mysql、apache、syslog。 ' Linux 服务器通常是可配置的。服务器程序通常处理许多命令选项。如果一次运行的选项太多,则使用配置文件来管理它们。大多数服务器程序都有配置文件并存储在/etc中。 Linux服务器程序通常在启动时生成一个PID文件,存放在/var/run目录下,用于记录后台进程的PID。 Linux服务器程序通常需要考虑系统资源和限制来预测它们可以承受多少负载,例如进程可用的文件描述符总数和内存总量。 01 日志 1.Linux系统日志: Linux提供了一个处理系统日志的守护进程——syslogd,以及升级版本——rsyslogd。 rsyslogd 守护进程可以接收用户进程输出日志,并且可以接受内核日志。 用户进程通过调用syslog函数生成系统日志。 该函数将日志输出到一个Unix本地域套接字类型(AF_UNIX)文件/dev/log,rsyslogd监视该文件以获取用户进程的输出。 以前的系统上的内核日志是通过另一个守护进程 rklogd 进行管理的,而 rsyslogd 利用附加模块来实现相同的功能。内核日志通过 printk 和其他交换树打印到内核环缓存中。环形缓存的内容直接映射到/proc/kmsg。rsyslogd 通过读取该文件来获取内核日志。默认情况下,调试信息保存在/var/log/debug,正常信息保存在/var/log/messages,内核信息保存在/var/log/kern.log。配置文件:/etc/rsyslog.conf,主要设置内核日志输入路径、是否接受UDP日志及其监听端口(默认514 /etc/services)、是否接受TCP日志及其监听端口、日志文件权限,以及包含哪些配置。文档。 2.syslog() 应用程序使用 syslog() 与守护进程 rsyslogd 进行通信。 该函数采用可变参数(第二个参数消息和第三个参数...)来构造输出。 优先级:设施值(按位异或)日志级别。默认设施值为:LOG_USER。下面讨论默认设施值的日志级别。 2.1 以下函数可以改变syslog的默认输出方式,进一步结构化日志内容 (1)ident:指定的字符串将被添加到日志消息的日期和时间之后,通常设置为程序的名称。 (2)logopt:配置后续syslog调用的行为。它可以对以下值进行按位异或 (3)facility:用于修改ysyslog的默认facility值 另外,日志过滤也很重要。在程序二次开发阶段,可能需要输出很多调试信息,而发布后,我们必须关闭这些调试信息。解决这个问题的办法不是在程序发布后删除调试代码(也许以后也会用到),而是在本地设置日志掩码,这样日志级别大于日志掩码的日志就会被删除。被系统忽略。 2.2 以下函数用于设置syslog日志掩码。 maskpri:指定日志掩码值。该函数始终返回成功。它返回调用进程的先前日志掩码值。 2.3 关闭日志功能: 02 用户信息 1.UID、EUID、GID、EGID 用户信息对于服务器安全非常重要。大多数人都说服务器以 root 身份启动并以非 root 身份运行。 基础知识: 一个进程有两个用户ID,UID和EUID。 EUID的目的是为了方便资源访问。它允许运行程序的用户拥有该程序的有效用户权限。例如,su用于更改帐户信息,但修改帐户时su程序的所有者是root。当普通用户运行su程序时,其有效用户是root,即程序的所有者。有效用户为root的进程称为特权进程。 EGID 与 EUID 类似。下面演示uid和euid的区别:将生成的可执行文件的所有者设置为 root 并在文件上设置 set-user-id 标志,然后运行。 从测试输出来看,进程的uid是启动程序的用户id,euid是root。 2.切换用户 03 进程间关系 1.进程组: Linux下的每个进程都属于一个进程组,因此除了pid之外,它们还有一个进程组ID(PGID)。我们使用下面的函数来获取指定进程组的PGID。 成功时返回 pid,失败时返回 -1,并设置 errno。 如果pid与pgid相同,则将pid指定的进程设置为进程组组长:如果pid为0,则表示当前进程的PGID为pgid;如果 pgid 为 0,则使用 pid 作为目标 pgid。 setpid函数成功时返回0,失败时返回-1,并设置errno。 进程只能设置自己或其子进程的PGID。而且,当子进程调用exec系列函数时,我们不能再在父进程中为其设置PGID。 2. 对话 (1)一些相关的进程会形成一个会话。以下函数用于创建会话: 该函数不能被进程组的领导进程调用,否则会产生错误。对于非领导进程来说,调用该函数不仅会创建一个新的会话,而且还有以下附加效果。 调用进程成为会话的领导者,并且是新会话的唯一成员。 创建一个新的进程组,其PGID为调用进程的PID,调用进程成为该组的领导者。 调用进程将丢弃终端(如果有的话) 该函数成功时返回新进程组PGID,失败时返回-1和errno。 Linux进程没有提供所谓会话ID的概念,但Linux系统认为它等于会话领导者所在进程组的PGID。 (2)并提供以下函数读取SID 3、使用ps命令查看进程关系 执行ps命令可以查看进程、进程组、会话之间的关系。 ps和less命令是在bash_shell下执行的,所以ps和less命令的父进程就是bash命令。这可以从PPID(父进程PID)一栏看出。 这三个命令创建一个会话(SID 为 2962)和两个进程组(PGID:2962、3102)。 bash命令的PID、PGID、SID都是一样的。显然是session的leader,也就是2962组的leader。ps时3102的leader, 04 系统资源限制在Linux上运行的程序会受到资源限制的影响,例如物理设备限制(CPU数量、内存量等)、系统策略限制(cup time等)以及具体实现限制(文件名最大长度) Linux系统资源限制可以通过以下一对函数读取和设置: 获取限制、设置限制 rlimit结构体定义如下: 成功时返回 0,失败时返回 -1,并设置 errno rlim_t 是一个整数类型,描述资源级别 rlim_cur 成员指定资源的软限制。建议且不应超过。如果超过,系统可能会向进程发送信号并终止操作。如果当前进程CPU时间超过软限制,系统将向进程发送SIGXCPU信号。 ;当文件大小超过其软限制时,系统将向进程发送 SIZEXFSZ 信号。 rlim_max 成员指定资源的硬限制。硬限制一般是软限制的上限。普通程序可以减少该限制,但只有以 root 身份运行的程序才能增加硬限制。另外,我们可以使用ulimit命令来修改当前shell环境下的资源限制(软/硬)。此修改对该 shell 启动的所有后续程序均有效。我们还可以通过修改配置文件来改变系统软限制和应用程序限制,并且这种修改是永久性的。 05 更改工作目录和根目录 某些服务器程序需要更改工作目录和根目录(web /var/www) 获取当前进程工作目录和更改进程工作目录的函数: buf参数指向的内存用于存储当前工作目录的绝对路径,size指定其大小。 如果当前目录的绝对路径范围(+1(‘’))超过大小,则 getcwd 返回 NULL 和 errno: ERANG。 chdir中的路径指向要切换到的目录。 0 表示成功,-1 表示设置 errno 失败。 更改进程根目录:chroot chroot 不会更改进程的当前工作目录。调用 chroot 后,还需要调用 chdir("/") 将工作转移到新的工作目录。之后,原来的文件描述符仍然有效。因此,可以使用前面打开的文件描述符来访问调用chroot后无法直接访问的文件(目录)。 06 服务器程序后台化 ***,如何在代码中阻止进程作为守护进程运行。守护进程的编写必须遵循一定的步骤。这是一个例子。 事实上,Linux提供了完成相同功能的库函数: nochdir:如果传递0,则工作目录将设置为“/”,否则将继续使用当前工作目录。noclose:传递0个标准输入输出,标准错误输出重定向到dev/null,否则继续使用原来的设备,成功为0,失败-1设置错误。

相关文章

最新资讯