场景,服务器启动着一个Java程序ROBOTAPP.java,我们需要保证这个程序一直处于运行中,达到开机自启,停止后自动运行的效果。
实现方式为,编辑一个自定义启动脚本,脚本给该程序打一个标记,并验证该标记的程序是否在运行中,没有则执行启动命令。
然后把脚本注册到系统的Crontab定时运行任务中,同时为了防止日志无限制增大,使用logrotate切割定时运行的日志和程序控制台日志。
例如我们的程序robot.jar在/www/wwwroot/robot目录下
在该目录下创建运行检查脚本:checkRun.sh,内容:
#!/bin/bash # 定义标记和日志路径 APP_MARK="-DJpom.application=ROBOTAPP" LOG_DIR="/www/wwwroot/robot" LOG_FILE="$LOG_DIR/ROBOTAPP.log" # 创建日志目录(如果不存在) mkdir -p "$LOG_DIR" # 启动命令 START_CMD="nohup java -Xmx4096M -Xms1024M -DJpom.application=ROBOTAPP -DJpom.basedir=/www/wwwroot/robot -jar /www/wwwroot/robot/robot.jar --server.port=8080 >> $LOG_FILE 2>&1 &" # 检查是否已经有该程序在运行 check_running() { # 使用 ps 命令查找包含标记的进程 pgrep -f "$APP_MARK" > /dev/null } # 主逻辑 if check_running; then echo "$(date '+%Y-%m-%d %H:%M:%S') - Application with mark '$APP_MARK' is running." >> "$LOG_FILE" else echo "$(date '+%Y-%m-%d %H:%M:%S') - Application with mark '$APP_MARK' is not running. Starting now..." >> "$LOG_FILE" eval "$START_CMD" fi
关于Crontab参考:http://www.javacui.com/linux/459.html
打开当前用户的 crontab 编辑器:
crontab -e
添加内容:
* * * * * /www/wwwroot/robot/checkRun.sh >> /www/wwwroot/robot/cron.log 2>&1
表示每分钟运行一次脚本,这样检查脚本会每分钟执行一次,并把执行日志输出到/www/wwwroot/robot/cron.log
配置日志切割
在 /etc/logrotate.d/ 目录下创建一个新的配置文件 robotCron
/www/wwwroot/robot/cron.log { daily rotate 7 missingok notifempty compress delaycompress copytruncate dateext dateformat -%Y%m%d }
创建一个新的配置文件 ROBOTAPP
/www/wwwroot/robot/ROBOTAPP.log { daily rotate 7 missingok notifempty compress delaycompress copytruncate dateext dateformat -%Y%m%d }
配置说明
daily:
表示每天滚动一次日志。
rotate 7:
表示保留最近 7 天的日志文件,超过 7 天的会被删除。
missingok:
如果日志文件不存在,logrotate 不会报错。
notifempty:
如果日志文件为空,则不进行滚动。
compress:
压缩旧的日志文件以节省磁盘空间。
delaycompress:
延迟压缩,即当天滚动后的日志不会立即压缩,而是在下一次滚动时压缩。这可以避免某些程序在写入日志时出现问题。
copytruncate:
先复制日志文件,然后截断原始日志文件。这对于持续写入日志的程序非常重要。
dateext 和 dateformat:
可选配置,用于为归档日志文件添加日期后缀,方便管理。
在修改完配置文件后,可以通过以下命令测试配置是否正确:
sudo logrotate -d /etc/logrotate.d/robotCron
-d 参数表示调试模式,它会显示 logrotate 的执行过程,但不会实际执行任何操作。
如果没有错误信息,说明配置文件是正确的。
手动运行 logrotate
如果你想手动运行一次 logrotate 来测试配置,可以使用以下命令:
sudo logrotate -f /etc/logrotate.d/robotCron
-f 参数表示强制运行,即使不符合条件(如未到滚动时间)也会执行。
自动运行 logrotate
logrotate 通常由系统的定时任务工具(如 cron)自动调用。大多数 Linux 发行版已经预配置了 logrotate 的每日任务,通常位于 /etc/cron.daily/logrotate。
你可以检查该文件是否存在:
ls /etc/cron.daily/logrotate
如果存在,则 logrotate 会每天自动运行一次。