在 Linux 上实现自动检测和启动 OpenOffice 的定时任务
前言
最近项目中用到的openoffice服务所部署的服务总是莫名的出现一些奇怪的现象 比如openoffice一直连接但是没有报错,正常运行中 openoffice服务的进程突然挂掉了。 这里记录下原因以及解决方案
原因
猜测自己粗心的原因,本地运行的其他项目调用的项目也是这个服务,导致同一时间访问的资源太多,连接池被占用等因素导致服务出现异常
解决方案
针对openoffice进程挂掉无法使用的问题。 1:考虑从代码层面添加重试机制或者多数据源切换 2:监听openoffice进程,并实现自动启动。 这里介绍第二个方案
基于linux Cron实现
- 编写自动检测 shell 脚本
#!/bin/bash
AppName=soffice
# 检查OpenOffice进程是否在运行
PID=`ps -ef |grep openoffice | grep $AppName |grep -v grep|awk '{print $2}'`
if [ x"$PID" != x"" ]; then
echo "OpenOffice进程正在运行,不执行操作。"
else
echo "OpenOffice进程未运行,执行启动操作。"
# 启动OpenOffice命令
nohup /opt/openoffice4/program/soffice.bin -headless -accept="socket,host=10.140.3.245,port=8100;urp;" -nofirststartwizard &
sleep 5
fi
以下是对脚本的解释:
- AppName=soffice:设置变量 AppName 的值为 "soffice",用于后续的进程检查。
- PID=$(ps -ef | grep openoffice | grep $AppName | grep -v grep | awk '{print $2}'):使用 ps 命令结合管道和 grep 过滤器来获取包含 "openoffice" 和 "soffice" 的进程,并使用 awk 提取进程的 PID。这样可以检查 OpenOffice 进程是否在运行。
- if [ x"$PID" != x"" ]; then:使用条件语句判断变量 PID 是否为空。如果不为空,表示 OpenOffice 进程正在运行,输出相应的提示信息。
- echo "OpenOffice进程正在运行,不执行操作。":输出提示信息,表示 OpenOffice 进程正在运行,不需要执行启动操作。
- nohup /opt/openoffice4/program/soffice.bin -headless -accept="socket,host=10.140.3.245,port=8100;urp;" -nofirststartwizard &:启动 OpenOffice 的命令。nohup 命令用于在后台运行进程,并将输出重定向到文件 nohup.out。-headless 参数表示以无界面模式启动,-accept 参数指定 OpenOffice 接受连接的方式(通过 socket 连接到指定的主机和端口),-nofirststartwizard 参数表示不显示首次启动向导。
- sleep 5:暂停脚本执行 5 秒,等待 OpenOffice 进程启动完成。
注意脚本要添加可执行权限
添加Cron定时任务
crontab -e
在下面添加一行
3-59/5 * * * * /opt/check_soffice.sh
以下是对 cron 表达式的解释:
- 3-59/5:表示在每小时的第 3 分钟到第 59 分钟之间的每 5 分钟执行一次。
- *:表示在每天的任意小时执行。
- *:表示在每月的任意日期执行。
- *:表示在每周的任意星期执行。
- *:表示在任意年份执行。
因此,这个 cron 表达式的含义是,在每小时的第 3 分钟到第 59 分钟之间的每 5 分钟执行一次 /opt/check_soffice.sh 脚本