【问题标题】:How to use ssh to schedule an 'at' job or a 'cron job' on a linux server from a python program on Windows client如何使用 ssh 从 Windows 客户端上的 python 程序在 linux 服务器上安排“at”作业或“cron 作业”
【发布时间】:2020-08-04 02:13:16
【问题描述】:

我正在尝试使用 os.system() 从 Windows 10 上的 python 应用程序安排在 linux 服务器上运行的作业。以下代码执行但未能安排作业。

os.system('ssh myadmin@mnop.com "at 09:00 {}".format("iostat > /home/myadmin/t.txt")')
os.system('ssh myadmin@mnop.com  "crontab 0 9 9 1 * /home/myadmin.msg.sh"')

我的目标是安排一次执行。感谢您的建议。

【问题讨论】:

    标签: python linux cron at-utility


    【解决方案1】:

    at 的唯一参数是时间;然后它从标准输入中读取命令。同样,crontab 从标准输入读取 cron 计划,而不是作为命令的参数。

    import subprocess
    
    subprocess.run(['ssh', 'myadmin@mnop.com', 'at 09:00'],
        text=True, check=True,
        input="iostat > /home/myadmin/t.txt\n")
    subprocess.run(['ssh', 'myadmin@mnop.com', 'crontab'],
        text=True, check=True,
        input='0 9 9 1 * /home/myadmin/msg.sh\n')
    

    请注意,后者将为用户替换任何现有的crontab。我修正了您在评论中指出的错字。

    请注意我们如何切换到subprocess.run 而不是os.system,正如后者文档中所建议的那样。我进行了重构以避免不得不使用shell=True;或许也可以看看Actual meaning of 'shell=True' in subprocess

    【讨论】:

    • 您提供的“at”解决方案运行良好。谢谢你,三胞胎。执行 'crontab' 解决方案时,出现以下错误: CalledProcessError: Command '['ssh', 'myadmin@mnop.com', 'crontab']' returned non-zero exit status 1. (我打错字了输入。应该是,input='0 9 9 1 * /home/myadmin/msg.sh'
    • 那我猜它会给你一个错误信息,告诉你出了什么问题?通过去掉 Python 和 SSH 部分,您可以大大简化故障排除。尝试添加破折号,例如 crontab -
    • 我在 Linux 和 macOS 上都进行了测试,它们都不需要带有 crontab 的破折号。如果您正在为root 安装 crontab,则您的语法是错误的(它需要在命令之前有第五个字段来标识以哪个用户身份运行作业)。
    • 如果这就是你运行的所有代码,你真的不需要这里的 Python。使用format 合并两个静态字符串显然很奇怪,但也许这是一个简化的示例,来自更复杂的代码,其中这些复杂性是有意义的。
    • 您提供的两种解决方案现在都可以正常工作。 crontab 错误,“非零退出状态 1”已通过在 input='0 9 9 1 * /home/myadmin/msg.sh\n' 末尾添加 '\n' 得到解决 感谢您的明确指示.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2011-09-03
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多