Cron执行含URL空格转义的curl命令时被终止的问题排查
Cron执行Curl命令时URL被%20截断的解决方法
问题描述
最初的crontab配置:
00 09 * * 1-5 root /usr/bin/curl -k "http://localhost/notifications/cronRuleAction?&auth_id=some-uuid&password=somehash&action=action&type=type&sequence=User Sequence, User Sequence, User Sequence"
因curl不支持URL内的空格,将空格替换为%20后修改为:
00 09 * * 1-5 root /usr/bin/curl -k "http://localhost/notifications/cronRuleAction?&auth_id=some-uuid&password=somehash&action=action&type=type&sequence=User%20Sequence,User%20Sequence,User%20Sequence"
手动执行该curl命令正常,但Cron执行时,命令会在第一个%20处截断,Cron日志显示:
May 11 09:00:01 pc CROND[33215]: (root) CMDEND (/usr/bin/curl -k "http://localhost/notifications/cronRuleAction?&auth_id=some-uuid&password=somehash&action=action&type=type&sequence=User)
添加Xdebug调试后发现,移除URL中的空格或%20可触发请求,但添加后curl无法执行,IDE也收不到调试请求。
解决方案
1. 转义URL中的%符号
Cron中%是特殊字符,默认会被解析为换行符,还会将后续内容作为标准输入传递给命令。需用反斜杠\转义%:
00 09 * * 1-5 root /usr/bin/curl -k "http://localhost/notifications/cronRuleAction?&auth_id=some-uuid&password=somehash&action=action&type=type&sequence=User\%20Sequence,User\%20Sequence,User\%20Sequence"
2. 使用单引号包裹URL
单引号在Cron中不会解析内部的特殊字符(包括%),可直接避免截断问题:
00 09 * * 1-5 root /usr/bin/curl -k 'http://localhost/notifications/cronRuleAction?&auth_id=some-uuid&password=somehash&action=action&type=type&sequence=User%20Sequence,User%20Sequence,User%20Sequence'
3. 将命令写入脚本文件执行
如果URL参数复杂,推荐把curl命令写入单独的shell脚本,再让Cron调用脚本,彻底避开Cron的字符解析问题:
- 创建脚本文件
/root/run_cron_notification.sh,内容如下:
#!/bin/bash /usr/bin/curl -k "http://localhost/notifications/cronRuleAction?&auth_id=some-uuid&password=somehash&action=action&type=type&sequence=User%20Sequence,User%20Sequence,User%20Sequence"
- 给脚本添加执行权限:
chmod +x /root/run_cron_notification.sh
- 修改crontab配置:
00 09 * * 1-5 root /root/run_cron_notification.sh
验证方法
修改crontab后,可将任务时间改为当前时间后几分钟手动触发测试,然后查看Cron日志和服务端请求记录,确认命令是否完整执行。
内容的提问来源于stack exchange,提问作者Juan Carlos Alpizar Chinchilla
相关产品推荐
相关产品推荐

