用 shell 脚本来控制程序进程:启动、停止和重启在 Linux 中的操作
在CentOS中,使用Shell脚本完成对程序的启动和停止操作有以下几个原因:
- 简化操作:通过编写Shell脚本,可以将启动和停止程序的步骤整合到一个脚本中,简化了手动执行多个命令的过程。只需要运行一个脚本即可完成启动或停止操作。
- 自动化管理:使用Shell脚本可以实现程序的自动化管理。可以将启动和停止脚本与其他任务或系统事件结合,实现定时启动或停止程序的功能,提高了系统的可靠性和稳定性。
- 统一管理:通过使用Shell脚本,可以将程序的启动和停止操作集中管理,避免了手动操作可能带来的错误和遗漏。所有相关的启动和停止步骤都在脚本中定义,更加方便维护和更新。
- 可扩展性:使用Shell脚本能够为启动和停止操作提供更大的灵活性和扩展性。你可以根据需要添加其他额外的操作,如检查程序是否已经在运行、备份数据、发送通知等。
- 文档化和传承:编写Shell脚本可以作为记录和传承的工具。通过脚本,你可以清晰地记录下程序的启动和停止步骤,并将其分享给其他人使用或维护。
使用Shell脚本完成对程序的启动和停止操作可以提高操作的效率、系统的可靠性,并能够方便地管理和扩展程序的启动和停止过程。
下面是一个简单的示例,展示如何使用Shell脚本在CentOS中完成对程序的启动和停止操作。
- 创建启动脚本
start_app.sh
:
#!/bin/bash
# 检查程序是否已经在运行
if pgrep -f "your_program_name" >/dev/null; then
echo "程序已经在运行"
else
# 启动程序的命令
/path/to/your_program_name &
echo "程序已启动"
fi
在脚本中,your_program_name
表示你要启动的程序的名称,/path/to/your_program_name
是程序的路径。如果程序已经在运行,则脚本输出相应的消息;否则,执行启动命令并输出相关消息。
- 创建停止脚本
stop_app.sh
:
#!/bin/bash
# 停止程序的命令
pkill -f "your_program_name"
echo "程序已停止"
在脚本中,your_program_name
是你要停止的程序的名称。pkill -f
命令用于根据进程名停止程序。
- 设置脚本执行权限:
chmod +x start_app.sh stop_app.sh
通过 chmod +x
命令为脚本添加执行权限。
现在,你可以使用以下命令启动或停止程序:
# 启动程序
./start_app.sh
# 停止程序
./stop_app.sh
请确保脚本中的路径和程序名正确,并按照实际情况进行修改。
这只是一个简单示例,可以根据实际需求进行扩展,例如添加日志记录、错误处理等。
我们亦可以在shell脚本中使用firewall命令(已经添加对端口是否已经开启的判断,避免重复开启防火墙导致一些异常问题):
#!/bin/bash
# 指定要开启的端口号和协议
port=1234
protocol=tcp
# 检查端口是否已经开启
if firewall-cmd --list-ports | grep -q "\<$port\/$protocol\>"; then
echo "端口已经开启"
else
# 开启指定端口的防火墙规则
firewall-cmd --zone=public --add-port="$port/$protocol" --permanent
echo "已开启防火墙规则,允许端口 $port 的 $protocol 流量"
# 重新加载防火墙配置
firewall-cmd --reload
fi
在脚本中,port
和 protocol
变量定义了要开启的端口号和协议。
脚本首先使用 firewall-cmd --list-ports
命令列出当前开启的端口列表,并使用 grep
命令查找指定的端口。如果找到匹配项,表示端口已经开启,输出相应的消息。
如果未找到匹配项,则执行 firewall-cmd
命令开启指定的端口和协议,并输出相关消息。然后使用 firewall-cmd --reload
命令重新加载防火墙配置使其生效。
该脚本会根据端口是否已经开启进行判断,避免重复设置相同的防火墙规则。
更进一步,我们需要一个脚本文件完成启动和停止还有重启操作,下面是一个示例脚本:
#!/bin/bash
# 指定应用程序的路径和启动命令
app_path="/path/to/your/application"
start_command="start_command_here"
stop_command="stop_command_here"
start() {
# 检查应用程序是否已经在运行
if pgrep -f "$start_command" >/dev/null; then
echo "应用程序已经在运行"
else
# 启动应用程序
cd "$app_path"
eval "$start_command"
echo "应用程序已启动"
fi
}
stop() {
# 检查应用程序是否在运行
if pgrep -f "$start_command" >/dev/null; then
# 停止应用程序
pkill -f "$start_command"
echo "应用程序已停止"
else
echo "应用程序未在运行"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
start
;;
*)
echo "使用方法: $0 {start|stop|restart}"
exit 1
esac
exit 0
在脚本中,你需要修改以下部分:
-
app_path
:应用程序的路径。 -
start_command
:启动应用程序的命令。 -
stop_command
:停止应用程序的命令。
将你的应用程序的路径和相应的启动命令以及停止命令替换上述变量后,保存脚本文件并给予执行权限。
使用以下命令来执行脚本:
./script.sh start # 启动应用程序
./script.sh stop # 停止应用程序
./script.sh restart # 重启应用程序
根据需要选择 start
、stop
或 restart
命令来操作应用程序。脚本会检查应用程序是否已经在运行,并执行相应的操作。
综合上面所述,最终我们的实战脚本大致如下:
#!/bin/bash
start() {
# 检查应用程序是否已经在运行
if pgrep -f ChaosBusiness >/dev/null; then
echo "应用程序已经在运行"
else
# 指定要开启的端口号和协议
port=6690
protocol=tcp
# 检查端口是否已经开启
if firewall-cmd --list-ports | grep -q "\<$port\/$protocol\>"; then
echo "端口已经开启"
else
# 开启指定端口的防火墙规则
firewall-cmd --zone=public --add-port="$port/$protocol" --permanent
echo "已开启防火墙规则,允许端口 $port 的 $protocol 流量"
# 重新加载防火墙配置
firewall-cmd --reload
fi
# 启动应用程序
nohup ./ChaosBusinessClient &
echo "应用程序已启动"
fi
}
stop() {
# 指定要查找和杀死的进程名
process_name="ChaosBusiness"
# 使用 pgrep 命令查找匹配进程名的多个pid
pids=$(pgrep "$process_name")
if [ -z "$pids" ]; then
echo "未找到进程 $process_name"
else
echo "找到以下进程 $process_name 的pid: $pids"
# 使用 kill 命令逐个杀死进程
for pid in $pids; do
kill "$pid"
echo "已杀死进程 $pid"
done
fi
# 指定要查找和杀死的进程名
process_name="blade"
# 使用 pgrep 命令查找匹配进程名的多个pid
pids=$(pgrep "$process_name")
if [ -z "$pids" ]; then
echo "未找到进程 $process_name"
else
echo "找到以下进程 $process_name 的pid: $pids"
# 使用 kill 命令逐个杀死进程
for pid in $pids; do
kill "$pid"
echo "已杀死进程 $pid"
done
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
start
;;
*)
echo "使用方法: $0 {start|stop|restart}"
exit 1
esac
exit 0
实际运行效果: