CentOS7下为需传参的Python脚本配置Cron定时任务
你的Cron任务执行失败的核心原因很明确:你的Python脚本完全没处理命令行参数,还在等着交互式输入,而Cron运行在非交互式环境下,没有终端提供输入,脚本会一直挂起;另外末尾的raw_input也会导致同样的卡住问题。下面是一步步的解决方案:
解决步骤
1. 改造Python脚本,支持命令行参数
你需要把原来的交互式输入逻辑改成接收命令行参数,这样Cron才能把参数传递给脚本。推荐用Python内置的argparse模块,简单适配你要传的参数:
import sys import os from stat import S_IMODE, S_ISDIR, S_ISREG import pysftp from glob import glob import datetime import shutil import git from itertools import izip_longest import filecmp import argparse def main(prod_path, git_path, known_hosts_path, p): # 这里保留你原有的业务逻辑,直接使用传入的参数即可 # 比如原来的prod_path = raw_input(...) 现在替换成函数参数prod_path # 你的业务代码写在这里... if __name__== "__main__": # 配置命令行参数解析规则,和你Cron里用的参数名对应 parser = argparse.ArgumentParser(description='Sync Prod and Git files') parser.add_argument('-prod_path', required=True, help='Absolute path for Prod file downloads') parser.add_argument('-git_path', required=True, help='Absolute path for Git file downloads') parser.add_argument('-known_hosts_path', required=True, help='Absolute path to known_hosts file') parser.add_argument('-p', required=True, help='Production server password') args = parser.parse_args() # 调用主函数,传入解析后的参数 main(args.prod_path, args.git_path, args.known_hosts_path, args.p) # 仅在交互式终端运行时保留退出提示,Cron环境自动跳过 if sys.stdin.isatty(): raw_input("\n Press enter to quit")
关键修改点:
- 移除了
raw_input和getpass.getpass的交互式逻辑,改用argparse解析命令行参数 - 给末尾的退出提示加了终端判断,避免在Cron非交互式环境下卡住
- 注意参数名要和你Cron里的保持一致(比如你原来写的
-git-path要改成-git_path,和脚本解析规则匹配)
2. 调整Cron任务配置
首先编辑你的crontab:
crontab -e
然后修改成如下定时任务:
12 15 * * * /usr/bin/python /root/prodgit.py -prod_path /root/prod -git_path /root/git -known_hosts_path /root/known_hosts.txt -p xxxx >> /var/log/prodgit_sync.log 2>&1
重要细节:
- 加上
>> /var/log/prodgit_sync.log 2>&1是把脚本的输出和错误都写入日志文件,方便排查问题——Cron默认不会把内容输出到控制台,如果一定要输出到某个终端,可以替换成>> /dev/pts/0 2>&1(先通过tty命令查看你当前终端的路径),但日志文件的方式更稳定可靠 - 确保脚本有可执行权限:
chmod +x /root/prodgit.py(虽然指定了Python路径,这不是必须,但更规范) - 检查Cron服务状态:
systemctl status crond,未运行则启动并设置开机自启:systemctl start crond && systemctl enable crond
3. 测试验证
- 先手动运行脚本确认逻辑正常:
/usr/bin/python /root/prodgit.py -prod_path /root/prod -git_path /root/git -known_hosts_path /root/known_hosts.txt -p xxxx
- 手动测试没问题后,可以临时修改Cron的时间为当前时间的下一分钟(比如现在14:30,就写
31 14 * * * ...),等待任务执行后查看日志文件验证结果。
内容的提问来源于stack exchange,提问作者user3399495
相关产品推荐
相关产品推荐

