树莓派下管道传ed命令给crontab -e提示未修改问题咨询
问题原因分析
- 核心触发原因是你使用的 Debian 系 cron 3.0pl1 版本携带了专属补丁:
crontab -e会检查编辑器修改后的临时文件的时间戳,若临时文件修改时间与创建时间差小于1秒,就会判定为无修改,直接丢弃变更输出No modification made。
你通过管道传入ed命令的整个执行过程耗时远小于1秒,刚好触发了这个校验逻辑;而交互式输入ed命令的操作耗时必然超过1秒,所以可以正常生效。 - 你strace中抓到的
openat(AT_FDCWD, "crontabs/pi", O_RDONLY) = -1 EACCES (Permission denied)属于正常行为:/var/spool/cron/crontabs目录默认权限为drwx-wx--T,普通用户没有直接读取目录内文件的权限,该错误是crontab权限校验的正常逻辑,和你遇到的问题无关。 - 非交互式场景加strace后卡住是因为strace会拖慢进程执行、同时会捕获所有子进程的输出和系统调用,干扰了ed的输入流读取逻辑,属于strace工具的副作用,和原问题无关。
- 你尝试的
EDITOR='tee -a'方案失败也是同样的时间戳校验问题,tee写入速度过快,无法满足1秒的时间差要求。
解决办法
方案1:绕过时间戳校验
在编辑器执行逻辑后添加1秒等待,即可通过crontab的修改校验:
echo -e 'a\n#asdf\n.\nwQ' | EDITOR='sh -c "ed \"\$@\"; sleep 1"' _ crontab -e
方案2:使用更简单的crontab批量替换逻辑(推荐)
不需要通过crontab -e模拟编辑,直接用crontab的标准输入替换功能实现行追加,逻辑更稳定:
# 导出现有crontab内容,追加目标行后重新写入 (crontab -l 2>/dev/null; echo '#asdf') | crontab -
2>/dev/null是为了兼容当前用户没有任何crontab配置时的报错,不影响正常场景使用。
内容的提问来源于stack exchange,提问作者bivoje
相关产品推荐
相关产品推荐

