Kubernetes CronJob无法执行Shell脚本:文件未找到问题求助
问题排查与解决方案
1. 修正命令执行格式与路径匹配
你第一个CronJob的command写法存在错误:/bin/sh -c仅能接收单个命令字符串,拆分多行的写法会导致后续命令被当成sh的位置参数而非执行指令。同时你第二次尝试里的cd /lime-deployments/路径与volumeMounts配置的/deployments不匹配,这会直接导致进入错误目录。
正确的命令配置示例:
command: ["/bin/sh", "-c"] args: - | echo "stop-lime job started" cd /deployments/kubernetes_on_premises/ ./lime.sh stop
2. 检查脚本执行权限
即便能通过cat查看脚本内容,缺少执行权限也会触发“文件未找到”类报错。可以通过两种方式解决:
- 在宿主机直接给脚本添加执行权限:
chmod +x /home/limeadm/deployments/kubernetes_on_premises/lime.sh - 或者在CronJob命令中临时补全权限:
command: ["/bin/sh", "-c"] args: - | echo "Checking script permissions..." ls -l /deployments/kubernetes_on_premises/lime.sh chmod +x /deployments/kubernetes_on_premises/lime.sh cd /deployments/kubernetes_on_premises/ ./lime.sh stop
3. 修正脚本Shebang行
Busybox镜像默认仅提供sh解释器,无bash。如果你的脚本开头写的是#!/bin/bash,会因找不到bash解释器触发报错(错误提示会伪装成“脚本未找到”)。
- 将脚本开头的Shebang改为
#!/bin/sh - 或者直接用
sh强制执行脚本,绕过Shebang依赖:command: ["/bin/sh", "-c"] args: - | cd /deployments/kubernetes_on_premises/ sh lime.sh stop
4. 确认hostPath挂载的节点一致性
hostPath仅在单个节点上有效,如果是多节点集群,需确保CronJob的Pod调度到了存在/home/limeadm/deployments/目录的节点。若需要跨节点共享脚本,建议改用PersistentVolumeClaim替代hostPath。
内容的提问来源于stack exchange,提问作者Jr.Macking
相关产品推荐
相关产品推荐

