101
storyxc 176 天前
@superrichman #12 学到了
|
102
hero1874 176 天前
还是得写脚本吧 cron 不行
|
103
p1gd0g 176 天前
歪个楼,不能改 sh 那能不能套一层 sh 呢。我看评论里的 cron 未免也太复杂了
|
104
josephok 176 天前
X-Y problem
|
105
josephok 176 天前 1
|
106
V2IEX 176 天前
cron 每分钟执行一次,代码里记录执行次数 n ,if(n%7)==0 执行代码
|
107
EndlessMemory 176 天前
穷举居然是最可靠的
|
108
channg 176 天前
没想到真能学到知识
|
109
CHTuring 176 天前
啊,以前从没想过 cron 的这种知识,都是网页生成一个就用了。
|
110
Goooooos 176 天前
#!/bin/bash
function is_execute(){ echo 1 >> exec_count.log lines="$(cat exec_count.log| wc -l)" if [ "$lines" -eq "7" ]; then cat /dev/null > exec_count.log return 0 else return 1 fi } is_execute rs="$?" 笨方法,返回 0 就执行,1 就退出脚本。每分钟一次 |
111
dna1982 176 天前
什么年代了
早就该换 systemd 了 |
113
baoshijiagong 176 天前 1
@josephok Good!
如果不为解决实际问题,只是讨论 cron 用法,只考虑修改 crontab ,只能穷举, 7 * 7 条,如上面提及的 AI 回复的穷举。还可以优化一下,比如第一位可以改成类似 5-59/7 ,不用写一大堆。 那么引申一下,如果是 2, 3, 5, 7 以外的质数,比如 11 ,就没办法做到了。 如果是为解决实际问题,有很多 easy 的办法。 如 @josephok 所说,尽量少 X-Y 。OP 的第一行写道 “我的环境是 Ubuntu 22.04LTS 。”,那么给人的感觉是抛出一个实际待验证的问题,尽量表达好自己的意思,少误导你想求助的人,到底是真的抽象问题的探讨,还是要解决实际问题,如果是前者,最好是改成类似这样: 是否可以只在 crontab 里实现,每 7 分钟执行一次命令? |
114
y1y1 176 天前
加一层或者穷举
|
116
Huelse 176 天前
https://tool.lu/crontab/ 验证 `*/7 * * * *`确实不行,到整点就不对了,
换个思路,每分钟执行,在/tmp 存下时间,如果距离上次执行大于等于 7 分钟了就执行 sh |
117
wuyadaxian OP @baoshijiagong 因为之前查了资料,有系统环境差异。
比如#51 楼提到的,macOS 下 crontab 和 linux 下 crontab 就可能会不一样。 而且有些特别的 arm 芯片上的特定版本 os 下的 crontab 也可能有差异。 我考虑的是尽可能说出相关环境,用于实践测试。 |
118
wuyadaxian OP @baoshijiagong
你可以把它看做一道面试/考试题。 你进入正在一个面试/考试,电脑画面已经打开了 crontab -e 。 考题是每 7 分钟执行一次 test.sh 。 已经确认 user 对 test.sh 有读写运行权限。 一旦你关闭这个编辑界面面试/考试即结束。 ----------------------------------------------------- 以上是我瞎编的。 我并不是想解决任何实际问题。 毕竟实际问题上不会存在这么奇葩的要求,一般 */5 * * * * command 就够用了。 |
119
wuyadaxian OP |
120
ww2000e 176 天前
这种问大模型就行。。
|
121
darkengine 176 天前
sh 不能修改。
------ 自己写个脚本把这个 sh 包起来,新脚本每分钟跑一次,然后判断是否过了 7 分钟,是就调用这个目标 sh 就好了 |
122
wuyadaxian OP 我们现在拥有了两种解法
一种穷举法,见#22 ,#32 ,#33 ,#34 ,#113 一种复杂的 command 法,见#39 ,#40 ,#45 ,#51 ,#68 ,#96 ,#119 ----------------------------- 穷举法: #周一 0-56/7 0-21/7 * * 1 command 3-59/7 1-22/7 * * 1 command 6-55/7 2-23/7 * * 1 command 2-58/7 3-17/7 * * 1 command 5-54/7 4-18/7 * * 1 command 1-57/7 5-29/7 * * 1 command 4-53/7 6-20/7 * * 1 command #周二 2-58/7 0-21/7 * * 2 command 5-54/7 1-22/7 * * 2 command 1-57/7 2-23/7 * * 2 command 4-53/7 3-17/7 * * 2 command 0-56/7 4-18/7 * * 2 command 3-59/7 5-29/7 * * 2 command 6-55/7 6-20/7 * * 2 command #周三 4-53/7 0-21/7 * * 3 command 0-56/7 1-22/7 * * 3 command 3-59/7 2-23/7 * * 3 command 6-55/7 3-17/7 * * 3 command 2-58/7 4-18/7 * * 3 command 5-54/7 5-29/7 * * 3 command 1-57/7 6-20/7 * * 3 command #周四 6-55/7 0-21/7 * * 4 command 2-58/7 1-22/7 * * 4 command 5-54/7 2-23/7 * * 4 command 1-57/7 3-17/7 * * 4 command 4-53/7 4-18/7 * * 4 command 0-56/7 5-29/7 * * 4 command 3-59/7 6-20/7 * * 4 command #周五 1-57/7 0-21/7 * * 5 command 4-53/7 1-22/7 * * 5 command 0-56/7 2-23/7 * * 5 command 3-59/7 3-17/7 * * 5 command 6-55/7 4-18/7 * * 5 command 2-58/7 5-29/7 * * 5 command 5-54/7 6-20/7 * * 5 command #周六 3-59/7 0-21/7 * * 6 command 6-55/7 1-22/7 * * 6 command 2-58/7 2-23/7 * * 6 command 5-54/7 3-17/7 * * 6 command 1-57/7 4-18/7 * * 6 command 4-53/7 5-29/7 * * 6 command 0-56/7 6-20/7 * * 6 command #周日 5-54/7 0-21/7 * * 7 command 1-57/7 1-22/7 * * 7 command 4-53/7 2-23/7 * * 7 command 0-56/7 3-17/7 * * 7 command 3-59/7 4-18/7 * * 7 command 6-55/7 5-29/7 * * 7 command 2-58/7 6-20/7 * * 7 command ----------------------------- 复杂 command 法: * * * * * [ $(($(date +\%s) / 60 \% 7 )) -eq 0 ] && ( command ) |
123
awalkingman 176 天前
@hackerwgf #99 是吧,这个帖子氛围真好
|
124
Felldeadbird 176 天前
啊,涨知识了。cron 原来不被整除就 跑不了啊。我系统好多这样的设置。
|
125
janus77 176 天前
你在 sh 外面再包一层 sh 然后里面判断时间就行了吧
|
126
banyasmya23 176 天前
@bthulu #15 那用啥
|
127
msg7086 176 天前
cron 只能穷举,systemd-timer 让 AI 生成两个文件往服务器里一塞,一分钟搞定。
|
129
LXGMAX 176 天前
while
do if now - last > 7 * 60: run done /doge |
130
D33109 176 天前
每分钟执行一次 bash 脚本+ sleep 420,或者使用 at 命令
``` now=$(date +%s) next_run=$(($now + 420)) at -f /path/to/your/script.sh $(date -r $next_run +%H:%M) ``` |
131
gule10 176 天前
0,7,14,21,28,35,42,49,56 0,8,15,22 * * * command
3,10,17,24,31,38,45,52,59 1,9,16,23 * * * command 6,13,20,27,34,41,48,55 2,10,17,24 * * * command 2,9,16,23,30,37,44,51,58 4,11,18 * * * command 5,12,19,26,33,40,47,54 5,12,19 * * * command 1,8,15,22,29,36,43,50,57 6,13,20 * * * command 4,11,18,25,32,39,45,53 7,14,21 * * * command |
132
nomytwins 176 天前
*/7
每小时的 0 分、7 分、14 分、21 分、28 分、35 分、42 分、49 分、56 分 |
133
realpg 176 天前
cron + at
已运行超过 6 年 无差错 无漏执行 |
134
wanqingfengtao 176 天前
歪个楼,OP 考虑这么多,考虑闰秒了吗?🤪
|
135
wuyadaxian OP @wanqingfengtao 哈哈哈。没有。
全部交给 NTP 。 |
136
yankebupt 176 天前
@wuyadaxian 还真的,小时也可以用除 7 偏移量,只想到分钟可以,脑子瓦特了
|
137
guanzhangzhang 176 天前
@lolizeppelin #47 +1 ,看了 40 多层,才看到有人提 systemd 的 timer
|
138
yankebupt 176 天前 1
|
139
sampeng 176 天前 via iPhone
其实如果是我…我会改成 6 分钟或者 5 分钟。然后去怼提出这个需求的人。
|
140
jevonszmx 175 天前
我一般是每分钟执行,然后代码里面控制真正的逻辑
|
141
honjow 175 天前
@Felldeadbird #124 能跑啊。。。只是不能整除的话,最后一次间隔就不对啊
|
142
w568w 175 天前 1
@mingwiki 必须纠正一个误区:systemd 可能确实看起来功能很多,但毕竟是用 C 写的,实际上是非常轻量的:本身完全体只占用不到 10MB 内存、CPU 占用接近 0 。OpenRC 之类靠 Shell 程序的解决方案,怎么做都不如 C 性能高、占用小、功耗低。如果只看占用和功能,实际上服务和需求多起来,OpenRC 占不到多少便宜,对服务的控制力度还小得多。
大部分人还是由于对 systemd 的学习曲线望而却步或者不认同 systemd 的设计,所以认为 systemd 臃肿。但就楼主这个需求,systemd timer 应该是最简单、轻量的解决方案。 |
143
BraveXaiver 175 天前
题主现在有结论了不?可以 append 一下吗?
|
144
lolizeppelin 175 天前 via iPhone
在 cron 里绕来绕去
用 6 整除。脚本里根据启动时间 sleep 到 7 分钟 周期一 sleep 60 周期二 sleep 120 第六周期直接跳过 |
145
james122333 175 天前 via Android
@w568w
早就破 30MB 了好吗 压缩的不是真实大小 openrc... 2MB 以内 算上额外脚本包也多不了多少 systemd 要做那么多事早就注定它小不了 运行的东西多怎能期待它能占用小 很多东西都不是很必要 它提供的特性说实话我都用不到 很多东西我都可以直接写脚本解决 运行效率也不低 只要你会写 这种东西就不是给你组装使用的 灵活与扩充性降低 unix 哲学好在我能够用原生工具凑出我要的东西 而不用上游没出下游不用想 也不用整天在找工具 而且你太小看脚本了 |
146
james122333 175 天前 via Android
|
147
james122333 175 天前 via Android
|
148
w568w 175 天前
@james122333 #147
> 早就破 30MB 了好吗 压缩的不是真实大小……openrc... 2MB 以内 算上额外脚本包也多不了多少 我认为你和我说的根本不是一件事:我说的是 RAM 占用,你说的是安装后的文件体积。 --- > systemd 要做那么多事早就注定它小不了 运行的东西多怎能期待它能占用小 > C 语言上限高不代表用 C 写的都是好货 「注定它小不了」的数字和证据,来源请求?请勿脑测程序性能。我用你后一句的原话返还:要做的事情多不代表占用大、组合性好不代表占用小。 --- > unix 哲学好在我能够用原生工具凑出我要的东西 而不用上游没出下游不用想 是的,Systemd 和 Unix 哲学有冲突,但正如我说的,很多人不喜欢 Systemd 就是因为它的设计。KISS 和 All in one 本来就是有分歧的。但在服务调度和管理这件事上,我站 systemd 这边。 我没有一棒子打死 Shell ,只是认为应该给 systemd 正名。毕竟「污名化」「虚无化」 systemd 的声音太多,会给 Linux 萌新错误的第一印象。 --- > 你太小看脚本了 我哪里说脚本不好了?我的原话是:「就楼主这个需求,systemd timer 应该是最简单、轻量的解决方案」。你说的和我的回复有关系? --- > 再给你个看法 一个东西能性能高占用小 语言只是其中一个因素 很多时后更重要的还是在于你怎么写 你也知道只是个「看法」了,那我没啥好说的。就 C 和 Shell 的性能问题,我相信你心里有杆秤:你要硬说 Shell 就是能在服务管理的性能、功能和占用上替代 C ,我也没办法。我只知道嵌入式 Linux 很多都开始回归 systemd 了,我的印象里,16MB RAM 的板上系统跑裁剪版的 systemd 没有压力。 |
149
w568w 175 天前
提供一个 Systemd timer 的解法,在 /etc/systemd/system 下分别新建 myscript.service 和 myscript.timer 两个文件,填写以下内容:
myscript.service: [Service] Type=simple ExecStart=/path/to/myscript.sh myscript.timer: [Timer] Unit=myscript.service OnUnitActiveSec=7m [Install] WantedBy=timers.target 然后 sudo systemctl daemon-reload && sudo systemctl enable --now myscript.timer 。结束。 以上内容手敲,不保证对。 |
150
james122333 175 天前 via Android
@w568w
ram 占用也是一样的 systemd 主进程不算 还有很多子进程 要一并算在内 还脑测程序性能... 我要额外装 systemd 再给你看证据? 证据自取好吗 做的事多占用大是正比 你能减低占用但占用还是会上升 依照 systemd 做的事情我不觉得这是很值得的 我宁愿组合性高并一样设法降低占用 如果你以上一堆人写脚本方式推估当然是效能差 systemd 除了违背哲学以外还有 bug 以及漏洞问题 不是因为它只是违背哲学 而被视为污泥正是历史事件一步一步来的 以我所见相反 初学者反而觉得 systemd 好 而历史他们也不会知道 只有在这环境打滚久的会觉得 systemd 是垃圾 "你太小看脚本"不正是你说的怎么做都不如 C 写的吗?两者相比也并不能以单方面来看 至于 systemd timer 我看来还不如 cron 换技术不会只有效能考量 你可以说 c 写的好的效能好过其它 但写的差的你也没讲 讲这种话我是觉得你应该不是开发 C 绝对好也是种暴论 而根据使用经验 效能也体验不出来的 |
151
w568w 175 天前
@james122333 #150
> ram 占用也是一样的 systemd 主进程不算 还有很多子进程 要一并算在内 我看了一下我的桌面端占用:一个 systemd 10MB ,一个 systemd user 进程 8.4MB 。还有什么「起服务调度作用」的「子进程」? 另外注意比较公平:如果你认为 systemd-journald 、oomd 、resolved 等 systemd 模块也算 systemd 的一部分,那么请在计算 OpenRC 的占用时,把对应的进程也加上。毕竟 systemd 系统上是不需要那些进程的。 --- > 还脑测程序性能 ... 我要额外装 systemd 再给你看证据? 而我确实是有安装了 OpenRC 和 systemd 的服务器的,systemd 还是装在树莓派上的那个。需要我贴图给你比较两边的占用吗?我的结论是:两边占用差距不大,甚至 systemd 这边更小。 --- > systemd 除了违背哲学以外还有 bug 以及漏洞问题 ??你推崇的 Shell 没有 bug 和漏洞问题? --- > 只有在这环境打滚久的会觉得 systemd 是垃圾 > 根据使用经验 效能也体验不出来的 比资历和经验就没意思了,那你说得都对。 --- > 但写的差的你也没讲 systemd 是你说的「写的差」的吗? --- > 讲这种话我是觉得你应该不是开发 C 我还真是写过 C 的,而且主要就是嵌入式。另外「我写没写过 C 、有几年经验」和我的回复对不对有什么关系? 还是那句话,程序员用数据说话。不贴数据猛贴资历,那我没话说了,你说的都对。 --- > 至于 systemd timer 我看来还不如 cron 说了半天终于回主题上了,然而也没给任何证据,就一句「 xx 不如 yy 」。同上,不知道你想说什么。 |
152
james122333 175 天前 via Android
@w568w
当然算在内 那些进程说实话用处都不大 openrc 也并不会主动帮你开服务 与 systemd 因应情况启动程序不同 有些发行版甚至还会主动帮你启动一些东西 那你情况很特殊 我的使用情况是用小型 init 的占用都是极低 除非我开一些重量级应用直接盖过去 shell 当然可能会有漏洞 但 systemd 影响层面高过 shell 太多 而 shell 写的本身也有一定隔离效果 除非恶搞乱写 而 shell 也很多 一个有漏洞换掉即可 没在比资历 是看不懂是在科普是吗 其它人接不接受是另外一回事 systemd 当然是属于写的差的 不是我一个人在讲 我没填标点符号 C 开头那是另外一句 证据你有提供出来吗 讲证据是不是搞笑 |
153
james122333 175 天前 via Android
|
154
skinny 175 天前
既然不能可靠的每 7 分钟运行一次,那每分钟检查一次,保留最后一次运行时间,如果要确保只有一个实例就保存 PID 。这就是一种比较普遍可靠的方法。
记录保存: /var/<mytask>/last_execute_time /var/<mytask>/<mytask>.pid 程序基本逻辑就是先检查有没有其它实例在运行,然后检查当前时间和上次执行时间差。运行时保存时间戳和 PID 。 |
155
idigital 175 天前 via iPhone
试试 gpt 的回答
要使用 `cron` 调度器在 Unix/Linux 系统中每 7 分钟执行一次脚本,可以通过以下步骤实现: 1. **打开 Crontab 编辑器**: 使用以下命令打开 crontab 文件进行编辑。`crontab` 是用户级任务计划文件,可以使用以下命令来编辑当前用户的 crontab: ```bash crontab -e ``` 2. **添加 Crontab 任务**: 在 crontab 编辑器中添加以下行,表示每 7 分钟执行一次某个脚本。假设你的脚本在 `/path/to/your_script.sh`: ```cron */7 * * * * /path/to/your_script.sh ``` 这里,`*/7` 表示每 7 分钟执行一次任务。 3. **保存并退出编辑器**: 保存编辑并退出(具体的保存方式因不同的文本编辑器而异,例如在 `vim` 编辑器中是 `:wq`)。 4. **确保脚本可执行**: 确保你的脚本具有执行权限。如果没有,使用以下命令赋予可执行权限: ```bash chmod +x /path/to/your_script.sh ``` 例子解释: - `*/7 * * * *`:每 7 分钟执行一次任务。 - 前一个星号 `*` 表示分钟的占位符。 - 这里的 `/7` 表示每 7 分钟执行一次。 - 其他的星号 `*` 分别代表小时、日期、月份和星期几,而它们保持星号代表任何时间。 这样设置以后,cron 会根据定义的时间间隔每 7 分钟执行一次指定的脚本。 ### 其它注意事项 1. **查看 cron 日志**: 如果你想要确认 cron 是否在按预期执行脚本,可以查看系统的 cron 日志。日志文件位置因系统配置而异,但一般为 `/var/log/cron` 或 `/var/log/syslog`。 在某些系统中可能需要超级用户权限来查看这些日志,因此可以使用以下命令: ```bash sudo tail -f /var/log/cron ``` 或者 ```bash sudo tail -f /var/log/syslog ``` 2. **检查 cron 任务**: 如果要验证当前用户的 crontab ,包括编辑或列出已有的任务,可以使用以下命令列出任务: ```bash crontab -l ``` 通过这些步骤,你应该能够成功配置 cron 以每 7 分钟运行一次你的脚本。 |
156
wuyadaxian OP |
157
wuyadaxian OP @BraveXaiver append 了。感谢提醒。
|
158
fqzz 174 天前
换成 systemd timer 吧,cron 这么玩太折腾了
|
159
huangzhiyia 173 天前
value=$(echo $(( ($(cat /tmp/1045433_time 2>/dev/null || echo 0) + 1) % 7 )) > /tmp/1045433_time && cat /tmp/1045433_time) && [ "$value" -eq 0 ] && your_command_here
|
160
huangzhiyia 173 天前
上面每分钟执行一次就行了,第一次就会运行并输出到 0 ,每次运行命令后文件里的值执行以下逻辑:
v=(v+1) % 7 然后判断 v 是否等于 0 ,是的话就执行 your_command_here 命令。 这个命令放在 crontab 可能会有点问题,可能需要加绝对路径以及对特殊的符合进行转义。 |
161
esee 173 天前
用另外的脚本调用这个脚本执行不就行了。一定要纠结在 crontab 中运行这个吗
|
162
hpkaiq 173 天前
每分钟执行,维护一个计数的文件或者其他的,每分钟加 1 ,如果等于 7 之行实际需要的逻辑,然后重置计数等于 0
|