赞
踩
liunx服务器上有很多细节需要注意 ,这些细节很重要而且是 模版状,称为服务器规范
比如
服务器的调试和维护都需要一个专业的日志系统,liunx提供一个守护进程来处理日志 —syslogd
现在liunx用到的都是他的升级版 — rsyslogd
rsyslogd 既能接受用户日志 也能接受内核日志 用户调用syslog来将信息输出到本地UNIX域中的socket类型的文件/dev/log rsyslog则监听该文件以获取 用户进程的输出。
在老系统上内核日志是通过守护进程rklogd来管理的。 rsyslogd利用额外的模块来实现了相同的功能。内核日志由printk等函数打印到内核的环状缓存中 环状缓存中的内容直接映射到/proc/kmsg文件中. rsyslogd则通过读取该文件获得内核日志。
rsyslogd守护进程收到用户进程或者内核输入的日志后 会输出到指定的日志文件中,这些都是可以配置的
一图概括
应用程序采用syslog函数和rsyslogd守护进程通信,定义如下
第一个参数是日志级别
第二个可变参数 用于输出具体日志内容
日志级别如下
还可以通过设置日志掩码 来保证发布的程序不会出现大量的日志日志级别大于日志掩码的日志信息将会被忽略
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
一些有关联的进程组将会形成一个会话,下面函数用于创建一个会话
该函数如果由进程组的首领调用的话 会产生一个错误,对于非组首领进程,调用该函数不仅会创建新会话,而且有以下效果
liunx进程并未提供所谓的会话ID的概念,但liunx系统认为它等于会话首领所在的进程组PGID
并提供了如下函数来读取SID
liunx上面的程序会收到资源限制,如物理设备限制(CPU 数量 内存数量). 系统策略限制等。以及具体的视线
liunx系统资源限制可以通过下一对函数来读取和设置
rlim参数是rlimit 结构体类型的指针 rlimit结构体的定义如下
两个参数 cur 和 max 分别表示资源的软限制和硬限制 ,都是整数类型。软限制是一个建议,最好不要超过。超过就可能被终止运行。如文件超过尺寸。如进程的cpu时间超越其限制。我们可以使用ulimit修改当前shell环境下面的限制 但是一般只是暂时的 只有修改相关的配置文件 来改变系统的软限制和硬限制才是永久的
下面表格列出来比较重要的资源限制
ulimit -a 可以查看相关的资源限制
有些服务器程序需要改变工作目录和根目录。
获取进程当前工作目录和改变进程工作目录的函数分别是
buf参数指向的内存 存储进程当前工作目录的绝对路径名,其大小由size参数指定
如果当前工作目录的绝对路径长度(加上一个空结束字符 \0) 超过了size,则getcwd 将返回NULL,并设置error 为ERANGE。
如果buf为NULL并且siz 非 0 则getcwd可能在内部使用malloc动态分配内存,并将进程的当前工作目录存储其中,这种情况我们需要手动释放这块内存。
getcwd函数成功时返回一个指向目标存储区(buf指向的缓存区 或是getcwd 在内部动态创建的缓存区指针) 失败则返回NULL并设置errno
chdir 函数的path参数指定要切换到的目标目录 。成功时返回0 失败时返回 -1 并设置errno
改变进程根目录的函数是chroot :
path参数指定要切换的目标根目录 。成功时返回 0 失败时返回-1 并设置errno chroot并不改变进程当前工作目录 ,所以调用chroot之后 人需要使用chdir(“/”)来将工作目录切换到新的根目录。
而且改变进程根目录后,程序可能无法方位类似/dev 的文件 和(目录)因为这些文件 并非处于新的根目录之下 。不过好在调用chroot之后,进程原先打开的文件描述符依然有用。所以。可以店里用早打开的文件描述符来访问chroot之后不能直接放文件的文件。尤其是一些日志文件。只有特定进程才能改变根目录。
下面程序展现了 如何将一个程序后台化 ,以守护进程的方式运行。
bool daemonize() { pid_t pid = fork(); if ( pid < 0 ) { return false; } else if ( pid > 0 ) { exit( 0 ); } umask( 0 ); pid_t sid = setsid(); if ( sid < 0 ) { return false; } if ( ( chdir( "/" ) ) < 0 ) { /* Log the failure */ return false; } close( STDIN_FILENO ); close( STDOUT_FILENO ); close( STDERR_FILENO ); open( "/dev/null", O_RDONLY ); open( "/dev/null", O_RDWR ); open( "/dev/null", O_RDWR ); return true; }
可以直接调用下面的库函数 来完成同样的功能
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。