Ожидается, что скрипт отлично работает в командной строке, но не работает в cron - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть python скрипт, который вызывает скрипт оболочки следующим образом:

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-скрипт вручную, он работает нормально, Я вижу вывод вроде:

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

1 Ответ

3 голосов
/ 14 февраля 2020

Вам нужно изменить 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'
...