Shell脚本
Reference
Shell笔记
shell自动清理30天以上的文件
shell自动备份PVE里的虚拟机系统文件
chatgpt做的自动备份pve镜像
shell 定时备份文件夹脚本以及删除过期备份
写一个断电按顺序自动关闭服务器的脚本
GPT:自动停止服务,控制关机
GPT: Shell 停止Docker 应用
GPT: Shell从文档读取配置信息
Shell传参给脚本,带参数运行
GPT:Shell停止Systemd服务
停止Moosefs服务
StartMoosefs.sh
StopMoosefs.sh
StopDocker.sh
StopSysyemService.sh
备份脚本
Linux运维常用脚本总结
网卡绑定bond配置脚本
自动取文件脚本
shell脚本: 同步两个本地文件夹
分割mysql-slow慢日志的脚本
解压不成功退出整个解压
Linux操作 :批量截取文件第一列,去重
文本的一些操作
nginx监控脚本
监控tomcat脚本
kafka监控脚本
zookeeper监控启动脚本
本文档使用 MrDoc 发布
-
+
首页
GPT:自动停止服务,控制关机
## linux 如何写一个先停应用,再停docker 再停止moosefs服务 最后关机的脚本 步骤之间确定成功后再进行下一个步骤 , 用机器A控制机器B , 将结果输出到文件或者数据库 ``` #!/bin/bash # 设置机器 A 和 B 相关的参数 remote_host="machine-b-hostname-or-ip" remote_user="your-remote-username" remote_port="22" # 请注意:下面的服务名称可能与您的实际系统配置不同,请根据需要进行修改 service_name="your-service-name" # 设置结果输出路径和文件名(也可以输出到数据库) output_file="/path/to/output/file.txt" # 清空之前的输出记录 > $output_file # 使用 SSH 连接到机器 B,停止应用服务 ssh -q -p ${remote_port} ${remote_user}@${remote_host} "sudo systemctl stop ${service_name}" >> $output_file 2>&1 if [ $? -eq 0 ]; then echo "应用服务已成功停止" else echo "停止应用服务时出现错误,请检查日志!" >> $output_file 2>&1 exit 1 fi # 使用 SSH 连接到机器 B,停止 Docker 服务 ssh -q -p ${remote_port} ${remote_user}@${remote_host} "sudo systemctl stop docker.service" >> $output_file 2>&1 if [ $? -eq 0 ]; then echo "Docker 服务已成功停止" else echo "停止 Docker 服务时出现错误,请检查日志!" >> $output_file 2>&1 exit 1 fi # 使用 SSH 连接到机器 B,停止 MooseFS chunk server 和 metalogger 服务 ssh -q -p ${remote_port} ${remote_user}@${remote_host} "sudo /etc/init.d/mfschunkserver stop" >> $output_file 2>&1 if [ $? -eq 0 ]; then echo "MooseFS chunk server 已成功停止" else echo "停止 MooseFS chunk server 时出现错误,请检查日志!" >> $output_file 2>&1 exit 1 fi ssh -q -p ${remote_port} ${remote_user}@${remote_host} "sudo /etc/init.d/mfsmetalogger stop" >> $output_file 2>&1 if [ $? -eq 0 ]; then echo "MooseFS metalogger 已成功停止" else echo "停止 MooseFS metalogger 时出现错误,请检查日志!" >> $output_file 2>&1 exit 1 fi # 使用 SSH 连接到机器 B,执行关机命令 ssh -q -p ${remote_port} ${remote_user}@${remote_host} "sudo shutdown -h now" >> $output_file 2>&1 if [ $? -eq 0 ]; then echo "系统已成功关机" else echo "无法正常关机,请检查日志!" >> $output_file 2>&1 exit 1 fi # 输出全部日志到控制台(也可以不输出) cat $output_file # 将结果输出到数据库 # 实现这个功能需要一个合适的数据库,您需要安装相应的库并根据官方文档配置连接信息和数据表字段等。 # 一般可以使用 Shell 脚本来执行 SQL 查询并将数据插入到特定的数据库中。 ``` 请在上面的脚本中进行以下更改: 将 "machine-b-hostname-or-ip" 替换为机器 B 的主机名或 IP 地址。 将 "your-remote-username" 替换为您在机器 B 上使用的用户名。 将 "22" 替换为机器 B 上正在运行 SSH 服务的端口号。 将 "your-service-name" 替换为要在机器 B 上停止的应用服务的名称。 将 "/path/to/output/file.txt" 替换为自定义的输出文件路径和名称。 该脚本将通过 SSH 连接到机器 B 上并依次执行每个命令。在每个步骤结束时,脚本将通过检查命令的退出状态来确定是否成功,并将执行结果输出到指定的文件中。如果某一步出现错误,则会输出相应的错误信息,并以非零状态码退出脚本。如果所有步骤都成功完成,则会输出成功消息并正常关机。 注意,为了可读性和方便性,上面的脚本中省略了将结果输出到数据库的代码。如果需要将执行结果保存到数据库,请参照您所使用的数据库的相关文档,编写相应的 Shell 脚本来实现该功能。 ## shell脚本输出结果到数据库 ### shell版本: 输出结果到数据库通常需要使用数据库连接库及相应的 SQL 语句进行操作,下面以 MySQL 数据库为例示范一个将脚本执行结果插入到数据库中的方法。 首先,需要安装 MySQL 的命令行客户端(例如在 Ubuntu 系统中可以使用命令 sudo apt-get install mysql-client 安装),并确保数据库服务器处于运行状态。 然后,可以编写一个 Shell 脚本来获取输出文件的内容,并将其插入到 MySQL 数据库中。假设输出文件路径为 /path/to/output/file.txt,数据库登录用户名为 your_db_user,密码为 your_db_password,数据库名称为 your_db_name,则可以使用以下脚本: ``` #!/bin/bash # 获取需要插入的数据 result=$(cat /path/to/output/file.txt) # 连接到 MySQL 数据库,将结果插入到指定表中 mysql -u your_db_user -p"your_db_password" -D your_db_name << EOF INSERT INTO result_table (result) VALUES ("$result"); EOF 其中,result_table 是需要插入数据的数据表名,result 是需要插入的字段名,$result 是从输出文件中获取的数据。 ``` 上面的脚本通过使用 "Here Document" 来实现输入多行 SQL 命令,从而避免了在脚本中嵌入大量 SQL 语句和转义字符。 请注意,此方法需要将数据库用户名和密码作为明文放置于脚本中,可能存在安全风险,建议妥善保护脚本并限制数据库的访问权限。如果需要更安全的方法,可以将用户名和密码存储在另一个安全位置,并通过环境变量或其他方式传递给脚本。 ### Python版本: ```python #!/bin/bash # 获取需要插入的数据 result=$(cat /path/to/output/file.txt) # 连接到 MySQL 数据库,将结果插入到指定表中 mysql -u your_db_user -p"your_db_password" -D your_db_name << EOF INSERT INTO result_table (result) VALUES ("$result"); EOF 其中,result_table 是需要插入数据的数据表名,result 是需要插入的字段名,$result 是从输出文件中获取的数据。 上面的脚本通过使用 "Here Document" 来实现输入多行 SQL 命令,从而避免了在脚本中嵌入大量 SQL 语句和转义字符。 请注意,此方法需要将数据库用户名和密码作为明文放置于脚本中,可能存在安全风险,建议妥善保护脚本并限制数据库的访问权限。如果需要更安全的方法,可以将用户名和密码存储在另一个安全位置,并通过环境变量或其他方式传递给脚本。 ``` 其中,result_table 是需要插入数据的数据表名,result 是需要插入的字段名,result 的值为从输出文件中获取的数据。 上面的代码使用了 mysql.connector 库连接和操作 MySQL 数据库。通过 with 语句打开文件并读取内容,然后使用 SQL 语句将数据插入到指定表中。 请注意,此方法也需要将数据库用户名和密码作为明文存储在脚本中,可能存在安全风险,建议类似地妥善保护脚本并限制数据库的访问权限。如果需要更安全的方法,可以将用户名和密码存储在另一个安全位置,并通过环境变量或其他方式传递给脚本。 ## 以下是使用 Python 编写的停止应用、停止 Docker、停止 MooseFS 服务并关机的脚本,以及将执行结果输出到 MySQL 数据库的示例代码: ``` import paramiko import datetime import mysql.connector # 定义远程主机相关参数 remote_host_ip = 'your_remote_host_ip' remote_host_username = 'your_remote_host_username' remote_host_password = 'your_remote_host_password' # 定义需要停止的应用、Docker 和 MooseFS 服务的名字 application_name = 'your_application_service_name' docker_name = 'docker' moosefs_master_name = 'mfsmaster' moosefs_chunkserver_name = 'mfschunkserver' moosefs_metalogger_name = 'mfsmetalogger' # 定义 MySQL 数据库相关信息 db_host = "localhost" db_user = "your_db_username" db_password = "your_db_password" db_name = "your_db_name" # 获取当前时间的字符串形式 datetime_now = datetime.datetime.now() datetime_now_str = datetime_now.strftime('%Y-%m-%d %H:%M:%S') # 执行命令并返回结果 def execute_command(ssh_client, cmd): stdin, stdout, stderr = ssh_client.exec_command(cmd) output = stdout.read().decode() + stderr.read().decode() return output # 使用 SSH 连接到远程主机 ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(hostname=remote_host_ip, username=remote_host_username, password=remote_host_password) # 停止应用 cmd = f'sudo systemctl stop {application_name}' output = execute_command(ssh_client, cmd) if 'Failed to stop' in output: print(f'Error stopping {application_name}: {output}') else: print(f'Successfully stopped {application_name}') # 停止 Docker 服务 cmd = f'sudo systemctl stop {docker_name}' output = execute_command(ssh_client, cmd) if 'Failed to stop' in output: print(f'Error stopping {docker_name}: {output}') else: print(f'Successfully stopped {docker_name}') # 停止 MooseFS 服务 cmd = f'sudo mfsmaster -S && sudo mfschunkserver -S && sudo mfsmetalogger -S' output = execute_command(ssh_client, cmd) if any(service_name in output for service_name in [moosefs_master_name, moosefs_chunkserver_name, moosefs_metalogger_name]): print('Error stopping MooseFS') else: print('Successfully stopped MooseFS') # 关闭 SSH 连接 ssh_client.close() # 关机 cmd = 'sudo shutdown now' output = execute_command(ssh_client, cmd) # 输出执行结果到文件 with open('/path/to/output/file.txt', 'w') as f: f.write(output) # 插入执行结果到 MySQL 数据库中 db = mysql.connector.connect( host=db_host, user=db_user, password=db_password, database=db_name ) cursor = db.cursor() sql = f"INSERT INTO execution_log (time, command, result) VALUES ('{datetime_now_str}', 'stop_script', '{output}')" cursor.execute(sql) db.commit() cursor.close() db.close() ``` 在上面的示例代码中,使用了 paramiko 库来连接到远程主机并执行命令。在连接过程中,指定了远程主机的 IP 地址、用户名和密码。然后使用 sudo systemctl 命令分别停止了应用服务、Docker 服务和 MooseFS 服务,并检查了每个服务是否成功停止。最后执行了关机操作,并将执行结果输出到文件和 MySQL 数据库中。 请注意,在实际使用此脚本之前,需要将其中的参数值修改为你的实际配置信息。
dz
2023年5月10日 08:22
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码