编写一个脚本,如何通过systemctl status gdm来判断gdm服务已经停止,如果停止后,需要systemctl start gdm启动gdm服务,以下是一个简单的脚本示例,它会检查gdm
服务的状态,如果服务已经停止,它会启动gdm
服务。
保存以下脚本到一个文件,例如check_and_start_gdm.sh
,并确保它有执行权限(使用chmod +x check_and_start_gdm.sh
命令)。
#!/bin/bash
set -x
# 检查gdm服务是否已安装
if ! systemctl list-units --type=service --all | grep -q gdm; then
echo "gdm is not be installed, no need to check" | logger -t gdm_start_script
exit 1
fi# 检查启动次数文件是否存在,如果不存在则初始化
count_file=/var/lib/gdm/gdm_start_count
if [[ ! -f $count_file ]]; then
echo "0" > $count_file
fiwhile true; do
# 检查gdm服务的状态
service_status=$(systemctl is-active gdm)# 读取启动次数
start_count=$(cat ${count_file})# 判断服务状态
if [[ $service_status == "inactive" ]]; then
echo "$(date): gdm服务已经停止,正在启动..." | logger -t gdm_start_script# 启动gdm服务
systemctl start gdm# 增加启动次数
start_count=$((start_count + 1))
echo "$start_count" > $count_fileecho "$(date): gdm already bringup, counts: $start_count" | Logger -t gdm_start_script
else
echo "$(date): gdm is running"
fi# 等待10秒
sleep 10
doneset +x
其中
systemctl list-units --type=service --all
这个命令会列出所有服务单元,包括那些处于激活状态(active)、停止状态(inactive)、失败状态(failed)等。
以上代码:
1,创建了一个/var/lib/gdm_start_count文件来记录gdm的启动次数。如果文件不存在,则初始化为0。
2,在启动gdm服务前后,使用echo和Logger命令将相关信息发送到syslog。-t选项用于指定日志标签,便于识别。
3,在每次启动gdm服务时,都会增加/var/lib/gdm_start_count文件中的计数。
日志:
接着就可以配置服务了:
1. 创建服务单元文件
首先,你需要创建一个systemd服务单元文件。我们将这个文件命名为check_and_start_gdm.service
,并将其放在/etc/systemd/system/
目录下。使用你喜欢的文本编辑器(如vi
或nano
)创建并编辑该文件。
sudo vi /etc/systemd/system/check_and_start_gdm.service
然后,将以下内容粘贴到文件中:
[Unit]
Description=Check and Start GDM Service
After=network.target[Service]
Type=simple
ExecStart=/path/to/check_and_start_gdm.sh
Restart=on-failure
User=root[Install]
WantedBy=multi-user.target
确保将/path/to/check_and_start_gdm.sh
替换为check_and_start_gdm.sh
脚本的实际路径。
2. 使脚本可执行
确保你的脚本是可执行的。如果之前已经设置过执行权限,可以跳过这一步。否则,运行以下命令:
sudo chmod +x /path/to/check_and_start_gdm.sh
3. 重新加载systemd配置
每次创建或修改systemd服务单元文件后,都需要重新加载systemd的配置,以便它知道新的服务。运行以下命令来重新加载配置:
sudo systemctl daemon-reload
4. 启用服务
要使服务在开机时自动启动,你需要启用它。运行以下命令来启用服务:、
sudo systemctl enable check_and_start_gdm.service
5. 启动服务
现在,你可以手动启动服务来测试它是否工作正常:
sudo systemctl start check_and_start_gdm.service
如果一切顺利,服务应该会启动,并且gdm
也应该被正确检查并启动(如果需要的话)。
6. 检查服务状态
要检查服务的状态,可以使用以下命令:
sudo systemctl status check_and_start_gdm.service
这将显示服务的当前状态,包括是否正在运行,最近一次启动或停止的时间等信息。
7. 设置服务开机自启
如果在第4步中启用了服务,那么它应该已经设置为开机自启。要确认这一点,可以查看服务是否已设置为开机自启:
sudo systemctl is-enabled check_and_start_gdm.service
如果输出为enabled
,则表示服务已设置为开机自启。
8. 可能的错误和调试
如果在任何步骤中遇到问题,检查系统日志可能会提供有关错误的更多信息。使用以下命令查看系统日志:
sudo journalctl -u check_and_start_gdm.service
这将显示与check_and_start_gdm.service
相关的日志条目,包括任何启动失败或错误消息。
遵循这些步骤后,你的check_and_start_gdm.sh
脚本应该已经作为一个CentOS服务设置好了,并且会在系统启动时自动运行。
在/etc/systemd/system目录下出现很多后缀为.wants的目录,如getty.target.wants,sysinit.target.wants, 为什么需要这些目录,照理可以直接写对应的service文件
在 systemd 的目标(target)和服务(service)体系中,.wants
目录是一种特殊的目录结构,用于表示依赖关系。这些目录不是必需的,但它们提供了一种机制来组织和管理服务与目标之间的依赖关系。
让我们深入了解一下为什么需要这些 .wants
目录:
- 依赖管理:systemd 使用目标和服务来组织和管理系统启动和运行时的服务。一个目标通常代表系统的某个运行级别或模式(如
multi-user.target
、graphical.target
等)。服务则是实际运行的程序或守护进程。.wants
目录允许您指定当某个目标被激活时,哪些服务应该同时启动。 - 灵活性:通过使用
.wants
目录,您可以轻松地为目标添加或删除依赖服务,而无需修改目标文件本身。这提供了更大的灵活性,因为您可以在不更改系统核心配置的情况下,通过添加或删除.wants
目录中的符号链接来修改服务依赖。 - 易于管理:将服务文件放在
.wants
目录中,使得管理服务的依赖关系变得更为直观和简单。管理员可以轻松地查看哪些服务被包含在特定的目标中,以及哪些服务依赖于其他服务。 - 启用和禁用服务:通过使用
systemctl enable
和systemctl disable
命令,管理员可以轻松地启用或禁用服务。这些命令实际上是在.wants
目录中创建或删除符号链接。例如,如果您想在系统启动时自动启动某个服务,您可以使用systemctl enable
命令在相应的.wants
目录中创建一个符号链接。