systemctl

systemctl 是 Linux 系统中用来管理 systemd 服务和单元的工具。systemd 是一个系统和服务管理器,负责启动、停止、启用和禁用服务,以及管理系统的启动过程。systemctl 是与 systemd 交互的主要命令行工具,能够管理服务、挂载点、设备、套接字、计时器等。

基本语法

systemctl [OPTIONS] COMMAND [NAME]
  • OPTIONS:选项,如 --all(显示所有服务,包括未启动的服务)、--user(管理用户服务)。
  • COMMAND:操作命令,例如 start, stop, status
  • NAME:指定服务或单元名称,例如 nginx.service

常用操作命令

  • start:启动一个服务。
  • stop:停止一个服务。
  • restart:重启一个服务。
  • reload:重新加载服务配置(不重启服务)。
  • status:查看服务的当前状态。
  • enable:设置服务为开机自启。
  • disable:关闭服务的开机自启。
  • is-active:查看服务是否正在运行。
  • is-enabled:查看服务是否设置为开机自启。
  • list-units:列出所有系统单元(可以加上 --type=service 只列出服务)。

示例

启动和停止服务

启动一个服务(例如 nginx):

sudo systemctl start nginx

停止一个服务:

sudo systemctl stop nginx

重启和重新加载服务

重启服务(服务会被停止并重新启动):

sudo systemctl restart nginx

重新加载服务配置(不停止服务):

sudo systemctl reload nginx

查看服务状态

查看服务的当前状态,包括是否运行、日志信息等:

sudo systemctl status nginx

输出示例:

● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2024-09-16 08:45:24 UTC; 1h 15min ago
 Main PID: 1455 (nginx)
    Tasks: 3 (limit: 4915)
   CGroup: /system.slice/nginx.service
           ├─1455 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           ├─1456 nginx: worker process
           └─1457 nginx: worker process

开机自启和禁用服务

将服务设置为开机时自动启动:

sudo systemctl enable nginx

禁用服务的开机启动:

sudo systemctl disable nginx

查看服务是否正在运行

检查服务是否在运行:

sudo systemctl is-active nginx

返回 active 表示服务正在运行,返回 inactive 表示服务未运行。

查看服务是否启用开机自启

查看服务是否启用了开机自启:

sudo systemctl is-enabled nginx

列出所有服务

列出系统中所有的服务:

systemctl list-units --type=service

查看日志

systemctl 可以结合 journalctl 查看服务的日志。例如,查看 nginx 的日志:

journalctl -u nginx

重载 systemd 配置

在修改了某些 systemd 配置文件后,需要重新加载 systemd 配置:

sudo systemctl daemon-reload

服务文件的位置

  • 系统服务文件:通常位于 /lib/systemd/system//etc/systemd/system/ 目录下,服务的配置文件以 .service 结尾。
  • 用户服务文件:可以位于 ~/.config/systemd/user/

服务文件中定义了服务的启动方式、依赖关系、描述信息等。

自定义服务文件

可以创建自己的 systemd 服务文件来管理自定义服务。以下是一个简单的示例:

自定义服务文件示例

假设我们想创建一个叫做 myapp 的服务,来运行一个简单的 Python 脚本。先在/home/ec2-user/目录下创建一个python文件:

sudo cat > /home/ec2-user/myapp.py <<EOL

from datetime import datetime

# Get current time
current_time = datetime.now()

# Print current time and "Hello, World!"
print(f"Current time: {current_time}")
print("Hello, World!")

EOL
  1. 创建服务文件 /etc/systemd/system/myapp.service
sudo nano /etc/systemd/system/myapp.service
  1. 服务文件内容:
[Unit]
Description=My Python Application
After=network.target

[Service]
ExecStart=/usr/bin/python3 /home/ec2-user/myapp.py
Restart=always

[Install]
WantedBy=multi-user.target
  1. 重新加载 systemd
sudo systemctl daemon-reload
  1. 启动服务:
sudo systemctl start myapp
  1. 设置为开机自启:
sudo systemctl enable myapp

运行journalctl -u myapp, 可以看到这个服务被不断的拉起:

image-20240917095542593

如果想把它改成一次性运行,可以指定Type=oneshot:

[Service]
Type=oneshot