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
/etc/systemd/system/myapp.service
:sudo nano /etc/systemd/system/myapp.service
[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
systemd
:sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp
运行journalctl -u myapp
, 可以看到这个服务被不断的拉起:
如果想把它改成一次性运行,可以指定Type=oneshot:
[Service]
Type=oneshot