【问题标题】:Expect script works fine in command line but does not work in cron job期望脚本在命令行中工作正常,但在 cron 作业中不起作用
【发布时间】:2020-02-15 13:12:35
【问题描述】:

我有 python 脚本,它像这样调用 shell 脚本:

p = subprocess.Popen([/path/to/script.sh], stdout=subprocess.PIPE,
                     stderr=subprocess.STDOUT)
output, error = p.communicate()

expect脚本:

#!/usr/bin/env expect
set username "user"
set password "pass"
cd /my/repo
spawn /usr/bin/git pull origin master
expect "Username"
send "$username\r"
expect "Password"
send "$password\r"
interact

当我手动运行 py-script 时,它工作正常,我看到如下输出:

Username for repo: user
Password for repo:
* branch            master     -> FETCH_HEAD
Already up to date.

但是当我通过 cron 运行我的脚本时,我看到了这个:

Username for repo: user
Password for repo:

然后什么也没有发生。我做错了什么?

我的 /etc/crontab 文件:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

10 *    * * * my_username /usr/bin/python3 /path/to/python/script.py

【问题讨论】:

  • 您如何准确定义cron 工作?请edit您的问题添加信息,不要在评论中回答。您的真实脚本是否在cd /my/repo 指定了一个绝对目录?也许你应该展示你的真实剧本。顺便说一句:您的脚本不是 shell 脚本,而是期望脚本。

标签: python linux git cron expect


【解决方案1】:

您需要将interact 更改为expect -timeout -1 eof

interact 仅在 Expect 脚本在 tty 上运行但 cron 作业不在 tty 上运行时有效。

您可以从交互式 shell 中验证这一点:

# this works
expect -c 'spawn sleep 5; interact'

# this does not work
true | expect -c 'spawn sleep 5; interact'

# this works
true | expect -c 'spawn sleep 5; expect -timeout -1 eof'

【讨论】:

    猜你喜欢
    • 2017-03-09
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2013-04-28
    • 2014-05-23
    相关资源
    最近更新 更多