目录
背景
在Debian 12系统中,原本部署了两个tomcat,结果总是遇到CPU飙升到影响应用正常使用的程度,找了很久原因还是没有找到。 每次都是将服务重启之后才能正常使用,一直想做定时重启也由于没有时间弄。 这次趁着有空余时间,记录一下处理过程。
过程记录
1、编辑sh文件,完成重启功能
Debian 下可以通过nano工具实现文件编辑,在需要设定定时重启的tomcat的bin目录下执行命令:
bash
sudo nano restart.sh
如果当前目录下没有该restart.sh会自动创建
该文件内容如下:
bash
#!/bin/bash
. /etc/profile
cd /opt/tomcat/apache-tomcat-9.0.41/bin/
sh shutdown.sh >output.txt 2>&1 && sh startup.sh >>output.txt 2>&1
. /etc/profile 命令用于确认环境变量
cd xxxx 跳转到当前需要重启的tomcat的bin目录
sh文件里的的 1、2 实际是 指的:
在 Linux 中有三个文件描述符,默认被系统所占用:
0 (Standard In 简写 stdin ):标准输入,通常来自键盘。
1 (Standard Out 简写 stdout):标准输出,通常指向终端窗口或屏幕。
2 (Standard Error 简写 stderr):标准错误输出,也通常指向终端窗口或屏幕,但专门用于显示错误信息。
> 与>>
> 和 >> 是用于重定向输出的符号,允许将命令的输出保存到文件中。区别在于:
>是覆盖重定向,将命令的输出重定向到指定的文件中,如果文件已经存在,则会覆盖 原有内容;如果文件不存在,则会创建新文件。
>>是追加重定向,将命令的输出追加 到指定文件的末尾,不会覆盖已有内容 。如果文件不存在,则会创建新文件。
>只能将标准输出重定向(对于标准错误依然会显示在屏幕上)
>&: 这个指令实际是实现将标准输出或标准错误都重定向输出;
>&
后面既可以识别文件,可以识别文件描述符。当
>&
后面接文件时,表示将标准输出和标准错误输出重定向至文件。当
>&
后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符。
例如,将标准错误文件描述符2重定向至标准输出文件描述符1:
2>&1实际指的就是 将文件描述符2即标准错误输出重定向到文件描述符1即标准输出。。。。哈哈有点绕。。。
**&& :**表示表示前一条命令执行成功后,才执行后一条命令。
结合起来后面两句命令的意思就是:
sh shutdown.sh >output.txt 2>&1 && sh startup.sh >>output.txt 2>&1
表示执行shutdown.sh并将标准输出写入output.txt文件里,shutdown.sh执行成功之后再执行startup.sh并将标准输出追加到output.txt里,两个sh执行时均将标准错误输出重定向到文件描述符1即标准输出,再进行重定向到txt里。
先通过
2&>1
将标准错误2输出重定向至标准输出1,再通过>
将标准输出1重定向到为output.txt中,使得output.txt中也包含了标准错误信息。不然仅有>output.txt
的话,我们无法将标准错误存入output.txt中,就无法根据这个日志去定位问题了
2、设置sh的可执行权限
linux下有严格的权限控制,sh文件要执行必须具有执行权限,由于前面我用sudo 创建的文件,所以文件的拥有者是root,也不具有执行权限,因此需要更改一下:
sudo chmod +x restart.sh 添加可执行权限
sudo chown XXX:XXX restart.sh 修改文件属主
3、设置定时任务
设置定时任务,可以通过linux系统提供的crontab命令来实现,该命令用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行。
通过man crontab可以查看英文版本命令介绍:
crontab 命令介绍如下:
NAME
crontab - maintain crontab files for individual users (Vixie Cron)
SYNOPSIS
crontab [ -h]
crontab [ -u user ] [-n] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
DESCRIPTION
crontab is the program used to install, deinstall or list the tables used to drive the cron(8) daemon in Vixie Cron. Each user can have their own crontab, and though these are files in /var/spool/cron/crontabs, they are not in‐
tended to be edited directly.
If the /etc/cron.allow file exists, then you must be listed (one user per line) therein in order to be allowed to use this command. If the /etc/cron.allow file does not exist but the /etc/cron.deny file does exist, then you must
not be listed in the /etc/cron.deny file in order to use this command.
If neither of these files exists, then depending on site-dependent configuration parameters, only the super user will be allowed to use this command, or all users will be able to use this command.
If both files exist then /etc/cron.allow takes precedence. Which means that /etc/cron.deny is not considered and your user must be listed in /etc/cron.allow in order to be able to use the crontab.
Regardless of the existence of any of these files, the root administrative user is always allowed to setup a crontab. For standard Debian systems, all users may use this command.
If the -h option is given, crontab shows a help message and quits immediately.
If the -u option is given, it specifies the name of the user whose crontab is to be used (when listing) or modified (when editing). If this option is not given, crontab examines "your" crontab, i.e., the crontab of the person
executing the command. Note that su(8) can confuse crontab and that if you are running inside of su(8) you should always use the -u option for safety's sake.
The first form of this command is used to install a new crontab from some named file or standard input if the pseudo-filename ``-'' is given.
If the -n option is given, it means "dry run": crontab examines "your" crontab for its syntax, and outputs a success message if this syntax is correct, but nothing is written to any crontab.
The -l option causes the current crontab to be displayed on standard output. See the note under DEBIAN SPECIFIC below.
The -r option causes the current crontab to be removed.
The -e option is used to edit the current crontab using the editor specified by the VISUAL or EDITOR environment variables. After you exit from the editor, the modified crontab will be installed automatically. If neither of the
environment variables is defined, then the default editor /usr/bin/editor is used.The -i option modifies the -r option to prompt the user for a 'y/Y' response before actually removing the crontab.
DEBIAN SPECIFIC
The "out-of-the-box" behaviour for crontab -l is to display the three line "DO NOT EDIT THIS FILE" header that is placed at the beginning of the crontab when it is installed. The problem is that it makes the sequence
crontab -l | crontab -
non-idempotent --- you keep adding copies of the header. This causes pain to scripts that use sed to edit a crontab. Therefore, the default behaviour of the -l option has been changed to not output such header. You may obtain
the original behaviour by setting the environment variable CRONTAB_NOHEADER to 'N', which will cause the crontab -l command to emit the extraneous header.
SEE ALSO
crontab(5), cron(8)
crontab对应的文件是:/etc/crontab,直接修改这个文件需要root权限。
crontab -e命令适用于所有用户,普通用户也能使用
命令如下:crontab -l 可以列举当前用户配置的定时任务情况
如上图,输入 crontab -u username -e回车之后出现提示选择编辑器,这里我选择nano,输入1:
之后进入nano编辑工具界面:
在这个界面 最后输入 如下内容:
0 0 * * * sh /opt/tomcat/apache-tomcat-9.0.41/bin/restart.sh
每个项中间用tab键隔开,从前到后分别表示
分、时、日、月、星期 、执行的命令,其取值范围如下:
第一列单位为分,表示每时第几分钟,范围为0-59;
第二列单位为时,表示每天第几小时,范围为0-23;
第三列单位为日,表示每月第几天,范围为1-31;
第四列单位为月,表示每年第几月,范围为1-12;
第五列单位为星期,表示每星期第几天,范围0-7,0与7表示星期日,其他分别为星期1-6;
执行的命令路径必须写绝对路径,避免出错。
* 则表示任意值都满足条件
以上述命令为例,即表示每天的0点0分均会去执行sh文件
根据需要设定即可。
通过crontab -l命令可以查询到 定时任务情况:
如图所示,分别在每天的15时30分以及35分去执行sh。
关于sh文件的执行命令写法:
使用相对路径执行:在当前目录下,可以使用./脚本名的方式执行脚本。例如,./helloworld.sh。如果脚本没有执行权限,可以使用sh 脚本名的方式执行,例如sh helloworld.sh。
使用绝对路径执行:也可以使用脚本的绝对路径来执行,例如/home/user/scripts/helloworld.sh。
设定了crontab 定时任务之后,需要确认服务是否启动。
网上很多资料说对应的服务名是crond,但是对于Debian系统不是,所以会有报错:
对于Debian系统,crontab对应的服务名为:cron
通过systemctl status cron就可以查询到服务状态。
上述步骤之后,重启cron服务,systemctl restart cron
经测试 发现是可以实现定时重启的。