Linux下间隔多少秒 (即以秒为单位) 去执行某条命令或某个shell脚本的操作方法【转】
在日常运维工作中, 经常会碰到以秒为单位去定时执行某些命令或监控脚本的需求。 说到定时任务就要用到crontab,通常来说,crontab的最小单位是分钟级别,要想实现秒级别的定时任务,就要进行特殊设置了。
测试:每隔2秒钟向/root/test.log文件输入"beijing is so good!", 下面介绍三种方法来实现秒级别的定时任务执行:
第一种方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
写一个触发的脚本,在触发脚本中使用死循环来解决此问题 [root@ test ~] # cat kevin.sh #!/bin/bash while : ; do echo "beijing is so good!" >> /root/test .log sleep 2 done [root@ test ~] # chmod 755 kevin.sh 可以把它放到计划任务使其运行 [root@ test ~] # crontab -e * * * * * /bin/bash -x /root/kevin .sh > /dev/null 2>&1 等待这个计划任务执行后,就将计划任务中的此条目删除或注释!防止该计划条目无限制地执行下去(只需执行一次就可以,因为kevin.sh脚本里本身就有死循环) [root@ test ~] # ps -ef|grep kevin.sh root 29839 29835 0 16:05 ? 00:00:00 /bin/sh -c /bin/bash -x /root/kevin .sh > /dev/null 2>&1 root 29842 29839 0 16:05 ? 00:00:00 /bin/bash -x /root/kevin .sh root 29852 16356 0 16:05 pts /0 00:00:00 grep kevin.sh [root@ test ~] # crontab -e #* * * * * /bin/bash -x /root/kevin.sh >/dev/null 2>&1 最后把这个脚本放到 /etc/rc . local 让它每次开机都可以被运行 [root@ test ~] # vim /etc/rc.local /bin/bash -x /root/kevin .sh > /dev/null 2>&1 验证(查看是不是每隔2秒在 /root/test .log文件中写入了) [root@ test ~] # tail -f /root/test.log beijing is so good! beijing is so good! beijing is so good! beijing is so good! beijing is so good! beijing is so good! beijing is so good! ......... ......... ======================================================================================================================== 温馨提示: 上面的kevin.sh脚本在第一次运行时千万不要执行 "nohup /bin/bash /root/kevin.sh &" , 即不要以这种方式放在后台执行, 否则会僵死!增加系统负载!! 例如很早之前用来监控 sftp 高可用中vip资源(172.16.51.193)的脚本,实时执行! 参考:https: //www .cnblogs.com /kevingrace/p/7868049 .html 1)第一台机器 sftp -node01的操作 (172.16.51.191) [root@ sftp -node01 ~] # cat /data/script/sftp_vip_monit.sh #!/bin/bash while [ "1" = "1" ] do NUM=`ip addr| grep 172.16.51.193| wc -l` if [ $NUM - eq 0 ]; then echo "vip is not at this server" > /dev/null 2>&1 fi if [ $NUM - eq 1 ]; then /usr/bin/rsync -e "ssh -p22" -avpgolr --progress --delete-before /data/sftp/mysftp/ root@172.16.51.192: /data/sftp/mysftp/ fi done [root@ sftp -node01 ~] # chmod 755 /data/script/sftp_vip_monit.sh [root@ sftp -node01 ~] # nohup sh /data/script/sftp_vip_monit.sh & //按ctrl+c结束 [root@ sftp -node01 ~] # ps -ef|grep monit root 10581 22167 0 19:42 pts /0 00:00:00 grep monit root 15113 1 8 17:15 ? 00:13:00 sh sftp_vip_monit.sh 2)第二台机器 sftp -node02 (172.16.51.192) [root@ sftp -node02 ~] # cat /data/script/sftp_vip_monit.sh #!/bin/bash while [ "1" = "1" ] do NUM=`ip addr| grep 172.16.51.193| wc -l` if [ $NUM - eq 0 ]; then echo "vip is not at this server" > /dev/null 2>&1 fi if [ $NUM - eq 1 ]; then /usr/bin/rsync -e "ssh -p22" -avpgolr --progress --delete-before /data/sftp/mysftp/ root@172.16.51.191: /data/sftp/mysftp/ fi done [root@ sftp -node02 ~] # chmod 755 /data/script/sftp_vip_monit.sh [root@ sftp -node02 ~] # nohup sh /data/script/sftp_vip_monit.sh & //按ctrl+c结束 [root@ sftp -node02 ~] # ps -ef|grep monit root 10581 22167 0 19:42 pts /0 00:00:00 grep monit root 15113 1 8 17:15 ? 00:13:00 sh sftp_vip_monit.sh 这种操作方式,虽然可以实现实时执行,但可能会造成僵死,加大系统负载! 可以参考上面第一种方式那样进行调整,实现每1秒钟来执行这个监控脚本! |
第二种方法
和第一种方法类似,只不过感觉比第一种更便捷一些。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
[root@ test ~] # vim kevin.sh #!/bin/bash for ((i=1;i<=20;i++)); do echo "beijing is so good!" >> /root/test .log sleep 2 done 然后添加脚本执行权限, 写入的 crontab 里每分钟执行一次 [root@ test ~] # chmod 755 kevin.sh [root@ test ~] # crontab -e * * * * * /bin/bash -x /root/kevin .sh > /dev/null 2>&1 [root@ test ~] # ps -ef|grep kevin.sh root 30515 30514 0 16:27 ? 00:00:00 /bin/sh -c /bin/bash -x /root/kevin .sh > /dev/null 2>&1 root 30516 30515 0 16:27 ? 00:00:00 /bin/bash -x /root/kevin .sh root 30527 16356 0 16:27 pts /0 00:00:00 grep kevin.sh [root@ test ~] # tail -f /root/test.log beijing is so good! beijing is so good! beijing is so good! beijing is so good! beijing is so good! beijing is so good! ........ |
第三种方法
使用crontab计划任务来直接实现!经验证,这种方式是最靠谱,最稳妥的!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
[root@ test ~] # cat /root/kevin.sh #!/bin/bash echo "beijing is so good!" >> /root/test .log 添加脚本执行权限,并配置到 crontab 计划任务里(使用&& 或者 ;都是一样的效果)。思路:先过一分钟执行第一次,接着就是每隔2秒钟执行一次。 [root@ test ~] # chmod 755 /root/kevin.sh [root@ test ~] # crontab -e * * * * * /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 2 && /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 4; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 6; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 8; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 10; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 12; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 14; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 16; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 18; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 20; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 22; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 24; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 26; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 28; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 30; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 32; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 34; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 36; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 38; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 40; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 42; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 44; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 46; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 48; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 50; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 52; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 54; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 56; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 * * * * * sleep 58; /bin/bash -x /root/kevin .sh > /dev/null 2>&1 [root@ test ~] # tail -f /root/test.log beijing is so good! beijing is so good! beijing is so good! beijing is so good! beijing is so good! beijing is so good! beijing is so good! beijing is so good! beijing is so good! .......... .......... |
上面介绍的三种方法,比较倾向于推荐第三种方法,因为前两种方法并不是严格的间隔2秒执行的,可能会大于2秒,因为执行脚本(kevin.sh)本身也是需要一定时间的。如果对于精确度要求不高,推荐使用第二种方法。
转自
Linux下间隔多少秒 (即以秒为单位) 去执行某条命令或某个shell脚本的操作方法 - 散尽浮华 - 博客园 https://www.cnblogs.com/kevingrace/p/10220837.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?