期望脚本在命令行中工作正常,但在cron作业中不起作用

问题描述 投票:0回答:1

我有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
python linux git cron expect
1个回答
3
投票

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

[interact仅在Expect脚本在tty上运行但cron作业不在tty上运行时才起作用。

您可以从交互式外壳验证这一点:

# 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'
© www.soinside.com 2019 - 2024. All rights reserved.