systemd service 配置 ulimit 限制

Linux systemd service 配置 ulimit 限制 在 bash 中,有个 ulimit 命令,提供了对 shell 及该 shell 启动的进程的可用资源控制。主要包括打开文件描述符数量、用户的最大进程数量、coredump 文件的大小等。 在 CentOS 5/6 等版本中,资源限制的配置可以在 /etc/security/limits.conf 设置,针对 root/user 等各个用户或者 * 代表所有用户来设置。 当然,/etc/security/limits.d/ 中可以配置,系统是先加载 limits.conf 然后按照英文字母顺序加载 limits.d 目录下的配置文件,后加载配置覆盖之前的配置。 一个配置示例如下: soft nofile 100000 * hard nofile 100000 * soft nproc 100000 * hard nproc 100000 * soft core 100000 * hard core 100000 不过,在 CentOS 7 or RHEL 7 的系统中,使用 Systemd 替代了之前的 SysV,因此 /etc/security/limits.conf 文件的配置作用域缩小了一些。limits.conf 这里的配置,只适用于通过 PAM 认证登录用户的资源限制,它对 systemd 的 service 的资源限制不生效。登录用户的限制,与上面讲的一样,通过 /etc/security/limits.conf 和 limits.d 来配置即可。 对于systemd service的资源限制,如何配置呢? ...

systemd 的使用

Linux systemd 的使用 systemd 是一个庞大的系统,在这篇里,专注于 systemd 在 service,target 以及日志系统的使用。 service service 的书写 配置文件放在 /usr/lib/systemd/system/ 或者 /lib/systemd/system/ 中,以 .service 结尾。Systemd 默认从目录 /etc/systemd/system/ 读取配置文件,但是,里面存放的大部分文件都是符号链接。 # 配置文件大概格式 [Unit] Description=ATD daemon [Service] Type=forking ExecStart=/usr/bin/atd [Install] WantedBy=multi-user.target 配置文件是由 ini 格式书写的,按照几个大的区块来写,Unit 是该模块基础信息,Service 是 service 型 Unit 专属,Install 附加信息。 [Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。 - Description:简短描述 - Documentation:文档地址 - Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败 - Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败 - BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行 - Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动 - After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动 - Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行 - Condition...:当前 Unit 运行必须满足的条件,否则不会运行 - Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败 [Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。 - WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中。一般挂载为 multi-user.target。 - RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中 - Alias:当前 Unit 可用于启动的别名 - Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit [Service]区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。 - Type:定义启动时的进程行为。它有以下几种值。 - Type=simple:默认值,执行ExecStart指定的命令,启动主进程 - Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出 - Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行 - Type=dbus:当前服务通过D-Bus启动 - Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行 - Type=idle:若有其他任务执行完毕,当前服务才会运行 - ExecStart:启动当前服务的命令 - ExecStartPre:启动当前服务之前执行的命令 - ExecStartPost:启动当前服务之后执行的命令 - ExecReload:重启当前服务时执行的命令 - ExecStop:停止当前服务时执行的命令 - ExecStopPost:停止当其服务之后执行的命令 - RestartSec:自动重启当前服务间隔的秒数 - Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog - TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数 - Environment:指定环境变量 service 的管理 # 查看系统所有安装的服务项 systemctl list-unit-files --type=service # 查看系统所有运行的服务项 systemctl list-units --type=service # 查看系统所有开机自启动的服务项 systemctl list-unit-files --type=service | grep enabled # 查看指定服务项状态 systemctl status <服务项名称> # 查看服务项的依赖关系 systemctl list-dependencies <服务项名称> # 查看出错的服务 systemctl list-units --type=service --state=failed # 清除服务项的错误状态 systemctl reset-failed <服务项名称> # 查看系统启动耗时 systemd-analyze # 查看各项服务启动耗时 systemd-analyze blame | grep .service # 启动服务 systemctl start <服务项名称> # 停止服务 systemctl stop <服务项名称> # 重启服务 systemctl restart <服务项名称> # 重新读取配置文件 systemctl reload <服务项名称> # 使服务开机自启动 ## 需要配置 install systemctl enable <服务项名称> # 使服务不要开机自启动 systemctl disable <服务项名称> # 禁用服务 systemctl mask <服务项名称> # 启用服务 systemctl unmask <服务项名称> # 重新读取所有服务项 systemctl daemon-reload # 服务状态 enabled:已建立启动链接 disabled:没建立启动链接 static:该配置文件没有[Install]部分(无法执行),只能作为其他配置文件的依赖 masked:该配置文件被禁止建立启动链接 target Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。从这个意义上说,Target 这个概念类似于"状态点",启动某个 Target 就好比启动到某种状态。 ...