Linux设置定时任务

Linux设置定时任务,第1张

《使用PSSH批量管理Linux》 一文中,已经学习了使用pssh批量管理linux的技巧。而很多时候,我们需要定时执行一些任务,或者需要定时执行一些批量任务。因此,本文就来研究一下linux设置定时任务的方法。

主要参考 Linux Crontab 定时任务 、 Linux定时任务Crontab命令详解 和 Linux 定时任务详解 。

cron(crond)是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程。linux系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。另外,由于使用者自己也可以设置计划任务,所以,linux系统也提供了使用者控制计划任务的命令:crontab命令。

crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。

linux下的任务调度分为两类,系统任务调度和用户任务调度。

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。 /etc/crontab 文件就是系统任务调度的配置文件。

用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在 /var/spool/cron/crontabs/ 目录中,其文件名与用户名一致。

假设我们使用的是Ubuntu14045 Server版,查看 /etc/crontab ,内容为:

第一行SHELL变量指定了系统要使用哪个shell;第二行PATH变量指定了系统执行 命令的路径。
接下来的命令格式为:
m h dom mon dow user command
英文全拼为:
minute hour day month week user commond

注意, /var/spool/cron 目录中的用户调度任务,没有user一项,因为文件名已经代表了user。

在以上各个字段中,还可以使用以下特殊字符:

crontab命令格式为:
crontab [-u username] [file] [ -e | -l | -r ]

设置定时任务和时间紧密相关,如果服务器的时区时间设置和本地不同,就不能保证计划任务的正确执行。所以使用crontab的第一步,是调节好服务器的时间。

下面参考 Ubuntu 1604将系统时间写入到硬件时间BIOS ,对服务器时间进行调节。

时间是有时区的,无论硬件时间还是 *** 作系统时间。hwclock的时区在/etc/default/rcS文件中设置,里面有一个参数UTC,默认值为yes,表示使用UTC时区,如果设置为no,那表示使用osclock的时区。建议hwclock与osclock设置相同的时区,也就是no。

1、查看服务器硬件时间
sudo hwclock -r ,看到的时间格式为: Wed 23 May 2018 11:02:17 AM HKT -0031663 seconds

2、查看服务器系统时间
date ,看到的时间格式为: Wed May 23 11:02:41 HKT 2018

3、设置hwclock和osclock时区相同
sudo vim /etc/default/rcS ,找到:

修改为:

4、将系统时间写入硬件时间
sudo hwclock -w

5、修改系统时区
osclock的时区配置文件为/etc/timezone,不建议直接修改配置文件。

如果你想修改为CST时间,那么执行 sudo tzselect 命令时,选择Asia->China->Beijing Time即可,这时会提示使用Asia/Shanghai时区。(ubuntu和centos通用)

6、设置即刻生效
执行 date ,发现时区没有变化,依然是HKT。

sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
sudo ntpdate timewindowscom

如果执行ntpdate报错:ntpdate[18409]: no server suitable for synchronization found ,那么就换一个时间同步工具。
sudo apt-get install rdate
sudo rdate -s time-bnistgov

再次执行 date ,发现时区已经变成了CST。

7、硬件时间同步
sudo hwclock -r ,发现硬件时间落后。
sudo hwclock -w ,再次把系统时间写入硬件时间,同步完成。

实例1:每分钟、每小时、每天、每周、每月、每年执行

实例2:每小时的第3和第15分钟执行
3,15 myCommand

实例3:在上午8点到11点的第3和第15分钟执行
3,15 8-11 myCommand

实例4:每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 /2 myCommand

实例5:每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 1 myCommand

实例6:每晚的21:30重启smb
30 21 /etc/initd/smb restart

实例7:每月1、10、22日的4 : 45重启smb
45 4 1,10,22 /etc/initd/smb restart

实例8:每周六、周日的1 : 10重启smb
10 1 6,0 /etc/initd/smb restart

实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 /etc/initd/smb restart

实例10:每星期六的晚上11 : 00 pm重启smb
0 23 6 /etc/initd/smb restart

实例11:每一小时重启smb
0 /etc/initd/smb restart

实例12:晚上11点到早上7点之间,每隔一小时重启smb
0 23-7/1 /etc/initd/smb restart

实例13:每月的4号与每周一到周三的11点重启smb
0 11 4 mon-wed /etc/initd/smb restart

实例14:一月一号的4点重启smb
0 4 1 jan /etc/initd/smb restart

实例15:每小时执行/etc/cronhourly目录内的脚本
01 root run-parts /etc/cronhourly
run-parts这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是目录名了。

目标:每分钟查看一下ganglia的状态,并保存到/tmp/log/ganglia目录。

1、创建/tmp/log/ganglia目录
sudo mkdir -p /tmp/log/ganglia

sudo chmod a+w /tmp/log/ganglia

2、编辑crontab
crontab -e ,选择编辑器为vim

3、在crontab文件中添加一行

4、查看crontab任务
crontab -l ,看到任务已经添加成功。

5、等待了五分钟,发现/tmp/log/ganglia目录下啥也没有。
sudo service cron status ,状态正常。
sudo /etc/initd/cron restart ,重启cron试试。
又等待了五分钟,发现/tmp/log/ganglia目录下依然空空。

莫非是因为pssh没有使用绝对路径? whereis pssh ,找到pssh路径为 /usr/lib/pssh ,修改crontab为:

然而,并没有用。
还是查看下crontab日志吧!

以下主要参考 Ubuntu下用crontab 部署定时任务 。

1、编辑50-defaultconf
sudo vim /etc/rsyslogd/50-defaultconf

2、把cron前的井号去掉,也就是修改为:

3、重启rsyslog服务
sudo service rsyslog restart

4、重启crontab服务
sudo service cron restart

5、查看crontab日志
less /var/log/cronlog

果然发现了问题:

也就是说,命令确实按时执行了,只不过没有执行完,被百分号截断了,导致log文件没有正常生成!

修改crontab为:

终于,log文件成功生成,nice!但是,文件内容是空的!因为, /usr/lib/pssh 是一个目录,不是pssh命令!真正的pssh命令是parallel-ssh,找到它的位置为 /usr/bin/parallel-ssh ,修改crontab:

至此,问题圆满解决。
实际使用的时候,一天获取一次ganglia的状态就够了,所以crontab改成:

以上,每天执行一次定时任务,抓取ganglia的运行状态保存到日志文件中。紧接着,我们的目标是使用脚本检查当天的日志文件,如果发现ganglia运行异常,则产生一个错误日志。

1、假设日志文件ganglia-20180524log的内容为:

2、参考 grep命令最经常使用的功能总结 ,编写脚本checkgangliash

3、执行
chmod a+x checkgangliash

/checkgangliash

如果所有客户机的ganglia运行正常,就会输出All services are runing!。如果有的客户机ganglia进程不存在,则会在/tmp/log/ganglia/目录下生成当天的错误日志。

4、设置定时运行
因为日志的检查工作要在日志生成之后,所以时间上延后十分钟。

上面的脚本,还有很多要改进的地方。比如有的客户机宕机了,上面的脚本检查不出来。比如有的客户机ganglia服务没有启动,那么具体是哪几台?针对这两个问题,下面进行改进。假设已经知道客户机的数量为10。

参考 csplit命令 ,checkgangliash脚本修改为:

以上脚本,实现了当客户机数量不为10的时候,进行报错;当客户机ganglia服务没有启动时,进行报错,并且筛选出所有没有启动ganglia的客户机。

本文中,我们先学习了crontab的基础知识和基本用法。然后通过监控ganglia这一个应用场景来具体学习crontab的详细使用方法,包括查看cron日志的方法,crontab中命令转义的方法,定时执行脚本的方法,以及审阅日志脚本的编写和进阶。

至此,还不够完美,因为我们需要每天登录管理机查看有没有错误日志。下一篇 Linux设置邮件提醒 中,我们将会研究linux设置邮件提醒的方法。审阅完日志后,如果脚本能够给我们发送一封邮件,告知我们审阅的结果,那么我们就不必再每天查看错误日志。

答:1把附件下载到自己的电脑上。 2本地网卡的IP为固定的1921688100 3附件解压 打开tftp工具(注意:ip应为1921688100 上面那个地址应该为你所下载的u-boot改名为u-boot。bin放入的文件夹) 4执行目录下的telnetexe 输入命令: open 192

制作双击可以直接运行的jar包
1 JAR 文件包
JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式。JAR 文件非常类似 ZIP 文件——准确的说,它就是 ZIP 文件,所以叫它文件包。JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFESTMF 文件,这个文件是在生成 JAR 文件的时候自动创建的。举个例子,如果我们具有如下目录结构的一些文件:
\com\fieldstar\isdet\chap9 (文件夹)
AppletSecurityDemoclass (是一个Applet)
Ballclass (是一个Application)
如果我们使用 JDK 的 jar 命令把它打成 JAR 文件包 fieldstarjar,
jar cvf fieldstarjar com
当前文件夹中com文件夹下的所有文件都被加进fieldstarjar文件包中
但是这个jar包并不是双击直接运行的包。
这个 JAR 文件的内部目录结构为:
fieldstarjar
|-- META-INF
| `-- MANIFESTMF
|`-- \com\fieldstar\isdet\chap9
`--AppletSecurityDemoclass
`--Ballclass
java -cp fieldstarjar comfieldstarisdetchap9Ball
2 创建可执行的 JAR 文件包
制作一个可执行的 JAR 文件包来发布你的程序是 JAR 文件包最典型的用法。
Java 程序是由若干个 class 文件组成的。这些 class 文件必须根据它们所属的包不同而分级分目录存放;运行前需要把所有用到的包的根目录指定给 CLASSPATH 环境变量或者 java 命令的 -cp 参数;运行时还要到控制台下去使用 java 命令来运行,如果需要直接双击运行必须写 Windows 的批处理文件 (bat) 或者 Linux 的 Shell 程序。因此,许多人说,Java 是一种方便开发者苦了用户的程序设计语言。
其实不然,如果开发者能够制作一个可执行的 JAR 文件包交给用户,那么用户使用起来就方便了。在 Windows 下安装 JRE (Java Runtime Environment) 的时候,安装文件会将 jar 文件映射给 javawexe 打开。那么,对于一个可执行的 JAR 文件包,用户只需要双击它就可以运行程序了,和阅读 chm 文档一样方便 (chm 文档默认是由 hhexe 打开的)。那么,现在的关键,就是如何来创建这个可执行的 JAR 文件包。
创建可执行的 JAR 文件包,需要使用带 cvfm 参数的 jar 命令,同样以上述 test 目录为例,命令如下:
jar cvfm fieldstarjar manifestmf com
这里 fieldstarjar 和 manifestmf 两个文件,分别是对应的参数 f 和 m,其重头戏在 manifestmf。因为要创建可执行的 JAR 文件包,光靠指定一个 manifestmf 文件是不够的,因为 MANIFEST 是 JAR 文件包的特征,可执行的 JAR 文件包和不可执行的 JAR 文件包都包含 MANIFEST。关键在于可执行 JAR 文件包的 MANIFEST,其内容包含了 Main-Class 一项。这在 MANIFEST 中书写格式如下:
Main-Class: 可执行主类全名(包含包名)
例如,假设上例中的 Ballclass 是属于 comfieldstarisdetchap9的,而且是可执行的类 (定义了 public static void main(String[]) 方法),那么:
应该先用文本编辑器建立一个manifestmf文件;
这个 manifestmf 可以编辑如下:
Main-Class: testTest <回车>;
这里是:
Main-Class: comfieldstarisdetchap9Ball
这个 manifestmf 可以放在任何位置,也可以是其它的文件名,只需要有 Main-Class: testTest 一行,且该行以一个回车符结束即可。
之后在当前目录中创建了 fieldstarjar,这个 fieldstarjar 就是执行的 JAR 文件包。运行时只需要使用 java -jar testjar 命令即可。
或双击该jar文件运行
3 jar 命令详解
jar 是随 JDK 安装的,在 JDK 安装目录下的 bin 目录中,Windows 下文件名为 jarexe,Linux 下文件名为 jar。它的运行需要用到 JDK 安装目录下 lib 目录中的 toolsjar 文件。不过我们除了安装 JDK 什么也不需要做,因为 SUN 已经帮我们做好了。我们甚至不需要将 toolsjar 放到 CLASSPATH 中。
使用不带任何的 jar 命令我们可以看到 jar 命令的用法如下:
jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名
其中 {ctxu} 是 jar 命令的子命令,每次 jar 命令只能包含 ctxu 中的一个,它们分别表示:
-c 创建新的 JAR 文件包
-t 列出 JAR 文件包的内容列表
-x 展开 JAR 文件包的指定文件或者所有文件
-u 更新已存在的 JAR 文件包 (添加文件到 JAR 文件包中)
[vfm0M] 中的选项可以任选,也可以不选,它们是 jar 命令的选项参数
-v 生成详细报告并打印到标准输出
-f 指定 JAR 文件名,通常这个参数是必须的
-m 指定需要包含的 MANIFEST 清单文件
-0 只存储,不压缩,这样产生的 JAR 文件包会比不用该参数产生的体积大,但速度更快
-M 不产生所有项的清单(MANIFEST〕文件,此参数会忽略 -m 参数
[jar-文件] 即需要生成、查看、更新或者解开的 JAR 文件包,它是 -f 参数的附属参数
[manifest-文件] 即 MANIFEST 清单文件,它是 -m 参数的附属参数
[-C 目录] 表示转到指定目录下去执行这个 jar 命令的 *** 作。它相当于先使用 cd 命令转该目录下再执行不带 -C 参数的 jar 命令,它只能在创建和更新 JAR 文件包的时候可用。
文件名 指定一个文件/目录列表,这些文件/目录就是要添加到 JAR 文件包中的文件/目录。如果指定了目录,那么 jar 命令打包的时候会自动把该目录中的所有文件和子目录打入包中。
下面举一些例子来说明 jar 命令的用法:
1) jar cf testjar test
该命令没有执行过程的显示,执行结果是在当前目录生成了 testjar 文件。如果当前目录已经存在 testjar,那么该文件将被覆盖。
2) jar cvf testjar test
该命令与上例中的结果相同,但是由于 v 参数的作用,显示出了打包过程,如下:
标明清单(manifest)
增加:test/(读入= 0) (写出= 0)(存储了 0%)
增加:test/Testclass(读入= 7) (写出= 6)(压缩了 14%)
3) jar cvfM testjar test
该命令与 2) 结果类似,但在生成的 testjar 中没有包含 META-INF/MANIFEST 文件,打包过程的信息也略有差别:
增加:test/(读入= 0) (写出= 0)(存储了 0%)
增加:test/Testclass(读入= 7) (写出= 6)(压缩了 14%)
4) jar cvfm testjar manifestmf test
运行结果与 2) 相似,显示信息也相同,只是生成 JAR 包中的 META-INF/MANIFEST 内容不同,是包含了 manifestmf 的内容
5) jar tf testjar
在 testjar 已经存在的情况下,可以查看 testjar 中的内容,如对于 2) 和 3) 生成的 testjar 分别应该此命令,结果如下;
对于 2)
META-INF/
META-INF/MANIFESTMF
test/
test/Testclass
对于 3)
test/
test/Testclass
6) jar tvf testjar
除显示 5) 中显示的内容外,还包括包内文件的详细信息,如:
0 Wed Jun 19 15:39:06 GMT 2002 META-INF/
86 Wed Jun 19 15:39:06 GMT 2002 META-INF/MANIFESTMF
0 Wed Jun 19 15:33:04 GMT 2002 test/
7 Wed Jun 19 15:33:04 GMT 2002 test/Testclass
7) jar xf testjar
解开 testjar 到当前目录,不显示任何信息,对于 2) 生成的 testjar,解开后的目录结构如下:
==
|-- META-INF
| `-- MANIFEST
`-- test
`--Testclass
8) jar xvf testjar
运行结果与 7) 相同,对于解压过程有详细信息显示,如:
创建:META-INF/
展开:META-INF/MANIFESTMF
创建:test/
展开:test/Testclass
9) jar uf testjar manifestmf
在 testjar 中添加了文件 manifestmf,此使用 jar tf 来查看 testjar 可以发现 testjar 中比原来多了一个 manifest。这里顺便提一下,如果使用 -m 参数并指定 manifestmf 文件,那么 manifestmf 是作为清单文件 MANIFEST 来使用的,它的内容会被添加到 MANIFEST 中;但是,如果作为一般文件添加到 JAR 文件包中,它跟一般文件无异。
10) jar uvf testjar manifestmf
与 9) 结果相同,同时有详细信息显示,如:
增加:manifestmf(读入= 17) (写出= 19)(压缩了 -11%)
4 关于 JAR 文件包的一些技巧
1) 使用 unzip 来解压 JAR 文件
在介绍 JAR 文件的时候就已经说过了,JAR 文件实际上就是 ZIP 文件,所以可以使用常见的一些解压 ZIP 文件的工具来解压 JAR 文件,如 Windows 下的 WinZip、WinRAR 等和 Linux 下的 unzip 等。使用 WinZip 和 WinRAR 等来解压是因为它们解压比较直观,方便。而使用 unzip,则是因为它解压时可以使用 -d 参数指定目标目录。
在解压一个 JAR 文件的时候是不能使用 jar 的 -C 参数来指定解压的目标的,因为 -C 参数只在创建或者更新包的时候可用。那么需要将文件解压到某个指定目录下的时候就需要先将这具 JAR 文件拷贝到目标目录下,再进行解压,比较麻烦。如果使用 unzip,就不需要这么麻烦了,只需要指定一个 -d 参数即可。如:
unzip testjar -d dest/
2) 使用 WinZip 或者 WinRAR 等工具创建 JAR 文件
上面提到 JAR 文件就是包含了 META-INF/MANIFEST 的 ZIP 文件,所以,只需要使用 WinZip、WinRAR 等工具创建所需要 ZIP 压缩包,再往这个 ZIP 压缩包中添加一个包含 MANIFEST 文件的 META-INF 目录即可。对于使用 jar 命令的 -m 参数指定清单文件的情况,只需要将这个 MANIFEST 按需要修改即可。
3) 使用 jar 命令创建 ZIP 文件
有些 Linux 下提供了 unzip 命令,但没有 zip 命令,所以需要可以对 ZIP 文件进行解压,即不能创建 ZIP 文件。如要创建一个 ZIP 文件,使用带 -M 参数的 jar 命令即可,因为 -M 参数表示制作 JAR 包的时候不添加 MANIFEST 清单,那么只需要在指定目标 JAR 文件的地方将 jar 扩展名改为 zip 扩展名,创建的就是一个不折不扣的 ZIP 文件了,如将上一节的第 3) 个例子略作改动:

一、电子标书制作流程:
1、电子标书的内容:①唱标数据;②商务标;③技术标;④清单数据。
2、电子标书制作步骤:(1-4步骤可以不依次进行)
①填写唱标数据:唱标数据包括投标总价、建筑规模、投标工期、注册建造师姓名及编号等。
②导入商务标文件:进入软件后在左边空白处点击右键—添加同级目录—输入目录内容(如:投标函)--确定—右键点击“投标函”—导入事先填写完整的投标函文件—确定
如扫描件或其它文件不可导入,可先用金润电子标书生成器经过虚拟打印改变文件格式,再正常导入。
扫描文件及需进行压缩并把分辨率改为Wed/屏幕格式后才能导入。
③导入技术标文件:同②
④导入清单文件:此软件只支持导入TBF格式文件,TBF格式文件由清单计价软件用清单GCF文件转换而成。TBF格式文件可由最新版的宏业计价工程阅读器进行查看。
⑤投标文件加盖印章:插入证书密码锁—输入密码--点击“投标文件加盖印章”—点击加盖印章页码范围—确定—微调盖章位置。
(老师建议逐页加盖印章,避免遗忘或 *** 作失误。)
⑥固化投标文件,生成电子标书:文件固化后不可修改,如需修改,可撤销固化。
⑦存入标盾(2个标盾内各存一份电子标书),存入文件的同时生成检查码。
⑧输出纸质标书(根据招标方要求的制作份数及是否需要加盖鲜章)。原Word上不设置页码,在最后的打印过程中,设置页码即可。
⑨刻录光盘。
⑩将2个标盾及光盘装入信封,信封上注明检查码。

说明有人正在强登你的号码哦,请你提高警惕,至于webQQ,你可以进入体验一下, >状态:打开游戏输入完账号密码,点击登录游戏时出现类似下面对画面:
解决方案:
一:升级或卸载IE浏览器,XP系统默认是IE6,win7是IE8,XP可以升级到IE8,win7可以升级到IE9。如果已经升级可以通过控制面板卸载IE降级到原版本,然后再次登陆尝试。
二:将DNF中start文件里面的QQloginexe删掉,然后重新更新游戏。
三:通过其他正常运行的电脑下拷贝QQlogin,exe,文件替换原文件。
注:另附一种解决办法,比较简单而且大部分有效,将DNF游戏安装目录,叫“地下城与勇士”,整个复制到其他盘下,然后从里面选择start文件夹下对DNFchinaexe这个主程序再运行,大部分都可以正常了。

1、首先下载安装Notepad++,这是一款免费的且能够编辑C语言的软件。

2、然后下载安装tdm-gcc,这是为了给电脑配置环境变量,以便能够编译C语言的。

3、在安装完以上两款软件后,还要配置一下环境变量。

4、然后开始编辑C语言万年历,首先要判断一个年份是闰年还是平年,用一个子程序来做:

5、然后就开始写主程序:首先用scanf得到一个年份,在判断这个年份是平年还是闰年后用printf在CMD中打出来。

6、在编写完成后,在Notepad++界面下按下F5,在输入框中输入:

cmd /k gcc -o "$(CURRENT_DIRECTORY)\$(NAME_PART)exe" "$(FULL_CURRENT_PATH)" && CLS && "$(CURRENT_DIRECTORY)\$(NAME_PART)exe" & PAUSE & EXIT

7、最后点击运行,会d出CMD,在里面输入年份后回车:例如输入2017,然后回车,就会生成2017年的万年历了!


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13353965.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-20
下一篇 2023-07-20

发表评论

登录后才能评论

评论列表(0条)

保存