7-liunx服务器规范

目录

  • 概况
    • liunx日志
      • liunx系统日志
      • syslog函数
        • openlog 可以改变syslog默认输出方式 ,进一步结构化
    • 用户信息
    • 进程间的关系
    • 会话
        • ps命令查看进程关系
    • 系统资源限制
    • 改变工作目录和根目录
    • 服务器程序后台话

概况

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命令查看进程关系

在这里插入图片描述

系统资源限制

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;
}

可以直接调用下面的库函数 来完成同样的功能
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/406618.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

openGauss学习笔记-228 openGauss性能调优-系统调优-LLVM使用建议

文章目录 openGauss学习笔记-228 openGauss性能调优-系统调优-LLVM使用建议 openGauss学习笔记-228 openGauss性能调优-系统调优-LLVM使用建议 目前LLVM在数据库内核侧已默认打开&#xff0c;用户可结合上述的分析进行配置&#xff0c;总体建议如下&#xff1a; 设置合理的wor…

谷歌seo推广有什么方式?

首先是网站优化&#xff0c;这是所有SEO工作的基础&#xff0c;这不仅仅意味着关键词的优化&#xff0c;还包括提升网站的加载速度、确保良好的移动设备适配性、以及加强网站的安全性&#xff0c;一个技术性能优异的网站&#xff0c;能够为用户提供更佳的体验&#xff0c;从而受…

【IDEA】安装Jrebel实现热部署

前言 devtool虽然也可以实现热部署 但是新增完方法和修改完参数后 热部署不生效 需要重启 而Jrebel却不用 功能也比devtool强大 但是收费 这里教大家怎么使用 插件下载 激活Jrebel

通俗易懂地理解稀疏性

今天我想与大家探讨的是一个数学和工程学中的重要概念——稀疏性。这个概念可能听起来很抽象&#xff0c;但它实际上贯穿于我们生活中的许多方面。那么&#xff0c;稀疏性到底是什么呢&#xff1f;简单来说&#xff0c;在数学和信号处理领域&#xff0c;一个信号被称为稀疏&…

2024年最值得尝试的创业项目,利用信息差,普通人下班也能做

大家好&#xff0c;我是电商花花。 到了2024年&#xff0c;人们依然在寻找长期可靠的副业项目&#xff0c;但我建议暂时停一下&#xff0c;因为抖音小店这个轻松暴利的副业项目还在等着我们呢。 抖音小店无货源创业项目作为一个轻资产创业项目&#xff0c;操作简单&#xff0…

基于springboot+vue的信息化在线教学平台(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

018—pandas 生成笛卡尔积排列组合合并多列字符串数据

思路&#xff1a; 本需求需要将给定的几列数据&#xff0c;生成一个排列组合形式的数据列&#xff0c;利用到 Pandas 多层索引生成的笛卡尔积的方法。 二、使用步骤 1.引入库 代码如下&#xff08;示例&#xff09;&#xff1a; import pandas as pd2.读入数据 代码如下&…

每日一学—由面试题“Redis 是否为单线程”引发的思考

文章目录 &#x1f4cb; 前言&#x1f330; 举个例子&#x1f3af; 什么是 Redis&#xff08;知识点补充&#xff09;&#x1f3af; Redis 中的多线程&#x1f3af; I/O 多线程&#x1f3af; Redis 中的多进程&#x1f4dd; 结论&#x1f3af;书籍推荐&#x1f525;参与方式 &a…

【Ubuntu】解决Ubuntu 22.04开机显示器颜色(高对比度/反色)异常的问题

使用Ubuntu 22.04时强制关机了一下&#xff08;make -j16把电脑搞崩了&#xff09;&#xff0c;开机后系统显示的颜色异常&#xff0c;类似高对比度或反色&#xff0c;如下图。看着很难受&#xff0c;字体也没办法辨认。还好之前遇到过类似的问题&#xff0c;应该是一个配置文件…

政府采购网有哪些回款方式

政府采购网的回款方式多种多样&#xff0c;具体取决于采购项目的性质、规模以及采购单位与供应商之间的约定。以下是一些常见的政府采购网回款方式&#xff1a; 线上支付&#xff1a;随着电子商务的发展&#xff0c;越来越多的政府采购项目采用线上支付方式。这种方式方便快捷&…

TLS握手证书链的校验

看一遍忘一遍&#xff0c;还是自己写一遍&#xff0c;看看这次能记多久。 在TLS握手过程中&#xff0c;通过证书校验认证服务端的身份和交换加密秘钥&#xff0c;握手完成之后后续就可以进行加密数据传输。 在浏览器地址栏上点击锁的图标&#xff0c;能打开查看证书的详细信息…

猫毛过敏却想养猫时?如何缓解猫毛过敏?宠物空气净化器推荐

作为一个新养猫的主人&#xff0c;一开始并没有发现对猫咪过敏。直到养了半年才意识到这个问题&#xff0c;而此时我已经和猫咪有了深厚的感情。我不想放弃我的猫咪&#xff0c;但是留着它的话&#xff0c;我经常会因为流眼泪、打喷嚏、眼睛发红等过敏症状而影响日常生活&#…

位运算03 不用加号的加法[C++]

图源&#xff1a;文心一言 上机题目练习整理&#xff0c;位运算&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 网页版目录在页面的右上角↗~&#x1f95d;&#x1f95d; 第1版&#xff1a;在力扣新手村刷题的记录~&#x1f9e9;&#x1f9e9; 编辑&#xff1a;梅…

go 1.18 不同目录package引用问题

go 1.18开始使用module了 不同的package在vs code中引用的话 需要先开启 是Go1.11版本之后 推出的版本管理工具 有点类似java的 maven工具 可以引入依赖使用 go env -w GO111MODULEon 先把这个打开 然后在创建的vs code工作目录下 执行 module gomdoule module 模块名 会生…

(六)激光线扫描-三维重建

本篇文章是《激光线扫描-三维重建》系列的最后一篇。 1. 基础理论 1.1 光平面 在之前光平面标定的文章中,已经提到过了,是指 激光发射器投射出一条线,形成的一个扇形区域平面就是光平面。 三维空间中平面的公式是: A X + B Y + C Z + D = 0 A X+B Y+C Z+D=0

解决RabbitMQ管理页面异常/不正确的问题

正确的页面&#xff1a;有Channels、Exchanges等 异常/不正确的页面&#xff1a; 问题原因 我的RabbitMQ是用docker安装的&#xff0c;应该不会是安装的环境有问题。 而且MQ的服务确实是启动了&#xff0c;后端能正常使用&#xff0c;并且管理界面的登录页面也是能正常登录的&…

流程图:理解、创建与优化的视觉工具

流程图&#xff1a;理解、创建与优化的视觉工具 引言 在日常生活和工作中&#xff0c;我们经常遇到需要描述一系列步骤或过程的情况。这些步骤可能是制作一杯咖啡、完成一个项目&#xff0c;或者是解决一个复杂的数学问题。流程图&#xff0c;作为一种强大的视觉工具&#xf…

数据同步MySQL -> Elasticsearch

大家好我是苏麟,今天聊聊数据同步 . 数据同步 一般情况下&#xff0c;如果做查询搜索功能&#xff0c;使用 ES 来模糊搜索&#xff0c;但是数据是存放在数据库 MySQL 里的&#xff0c;所以说我们需要把 MySQL 中的数据和 ES 进行同步&#xff0c;保证数据一致(以 MySQL 为主)…

在 Jupyter Notebook 中查看所使用的 Python 版本和 Python 解释器路径

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 我们在做 Python 开发时&#xff0c;有时在我们的服务器上可能安装了多个 Python 版本。 使用 conda info --envs 可以列出所有的 conda 环境。当在 Linux 服务器上使用 which python 命令时&#xff0…

ES通用查询页面使用说明

前言:ES语法比较复杂,需要专门的学习,而且查询工具不太友好, 对公司运维人员使用有点困难,所以花了个时间做了一个页面,方便运维人员使用,如下。 也不难,有兴趣的朋友可以私聊发源码。 开发帮助-ES数据查询 搜索 输入要查看的文档索引,文档类型后点【查询】即可 搜…