2015-07-14 2 views
1

У меня ужасное время, когда вы запускаете скрипт bash, который использует wget для запуска в качестве запуска. Сценарий предназначен для автоматизации загрузки ежедневной кроссвордов New York Times. Обратите внимание, что для выполнения этой работы вам требуется подписка (USERNAME и PASSWORD).Сценарий bash/wget запускается из командной строки, но не запускается при запуске - выходные файлы не записаны

Оригинальный сценарий (который живет в http://web.mit.edu/lizdenys/Public/crossword) отлично работает и является впечатляющим и образовательным примером сценариев bash (по крайней мере для меня). Вот оргинал. Я изменил его для моего использования, включив пользователя и передав и комментируя шаги, чтобы загрузить что-либо, кроме версии PDF (мне нравится карандаш и бумага).

- = - = - = - = - = - = начать Баш скрипт - = - = - = - = - = - =

#!/bin/bash 

# crossword, 
# a wget-based nytimes crossword downloader 

# Liz A. Denys ([email protected]) 
# Last updated on May 13, 2015 

# This script downloads today's New York Times daily crossword. To 
# use, you must change the email and password information below so 
# that it corresponds to your premium New York Times account. 

# Get the current date. 
puzdate=`date "+%Y-%m-%d"` 
pdfdate=`date "+%b%d%y"` 

# Get the login page. 
wget --no-check-certificate https://myaccount.nytimes.com/auth/login \ 
    -O login.html &>/dev/null 

# Scrape token and expires values so wget can auth. 
token=`grep token login.html | sed -e 's/^.*value="\([0-9a-f]\+\)".*$/\1/'` 
expires=`grep expires login.html | sed -e 's/^.*value="\([0-9a-f]\+\)".*$/\1/'` 

# Log in with password. Note: this does not work without replacing 
# username and password information. 
wget --post-data \ 
    "userid=USERNAME%40DOMAIN.COM&password=PASSWORDVALUE&is_continue=false&remember=true&token=$token&expires=$expires" \ 
    --save-cookies=cookies.txt --keep-session-cookies --no-check-certificate \ 
    -O /dev/null https://myaccount.nytimes.com/auth/login &>/dev/null 

# Download puzzle in .pdf and .puz formats. 
wget --load-cookies=cookies.txt \ 
http://www.nytimes.com/svc/crosswords/v2/puzzle/print/$pdfdate.pdf \ 
    &>/dev/null 
wget --load-cookies=cookies.txt \ 
    http://www.nytimes.com/svc/crosswords/v2/puzzle/daily-$puzdate.puz \ 
    &>/dev/null 

# Clean up workspace. 
rm cookies.txt 
rm login.html 

- = - = - = - = - = - = end bash script - = - = - = - = - = - =

Я сделал требуемое редактирование, и сценарий запускался из командной строки В ПЕРВОМ ПОПЫТКЕ!

Поскольку у меня нет доступа к интернету каждый день, и поскольку (насколько я знаю) головоломки больше не доступны на следующий день после их появления, я решил, что буду автоматизировать работу, чтобы работать каждый день. Я использовал cron (для инкрементных резервных копий на Sparcstation) без каких-либо проблем, что когда-либо (используя make, чтобы выбрать файлы для записи на ленту - это показывает мой урожай), но нет, Apple хочет, чтобы я использовал launchd. Я всегда рад узнать что-то новое и полезное, поэтому моя задача состояла в том, чтобы узнать достаточно о launchd и plists, чтобы выполнить эту чрезвычайно простую работу. Не так!!

Вот один из многих plists, что не удалось:

- = - = - = - = - = - = начать .plist файл - = - = - = - = - = - =

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>Label</key> 
    <string>local.me.nytxwd</string> 
    <key>OnDemand</key> 
    <true/> 
    <key>ProgramArguments</key> 
    <array> 
     <string>/bin/sh</string> 
     <string>/Users/me/Documents/misc/nytimes_xword/nytimes_puzzle_dl4.sh</string> 
    </array> 
    <key>StandardErrorPath</key> 
    <string>/Users/me/Documents/misc/nytimes_xword/err</string> 
    <key>StandardOutPath</key> 
    <string>/Users/me/Documents/misc/nytimes_xword/tmp</string> 
    <key>WorkingDirectory</key> 
    <string>/Users/me/Documents/misc/nytimes_xword/</string> 
</dict> 
</plist> 

- = - = - = - = - = - = конец .plist файл - = - = - = - = - = - =

Вот мои наблюдения:

-script работает отлично от команды line (с необходимыми модами) -script не работает при запуске с запуска (выход 1) в соответствии с -user (~/Library/LaunchAgents /). Системный журнал показывает, что файл, который ищет grep и содержит два основных бита данных, никогда не записывается в целевой каталог («grep token login.html - нет такого файла»).

Первоначально я пытался запускать работу StartCalendarInterval в 0900 каждый день, но когда это не удалось, я переключился на OnDemand, используя loadctl load/unload для отладки. Somethings, что я пробовал:

Указание пути в PLIST (ошибка, из, рабочий каталог) - никакой помощи

Изменение владельца и разрешений на целевом каталоге. - нет помощи

Изменение путей в сценарии, чтобы быть абсолютным (нет ~, нет $ HOME, no., no relative). - нет помощи https://myaccount.nytimes.com/auth/login \ -О /Users/me/Documents/misc/nytimes_xword/login.html &>/DEV/нуль>

Я прочитал страницы man для launchd, launchctl, launchd.plist без каких-либо прозрений.

Я искал каждую комбинацию launchd/bash/wget и узнал что-то, но все равно не имел успеха.

Я привел пример, предоставленный http://www.mactech.com/articles/mactech/Vol.21/21.06/launchd/index.html и он сработал! Однако это не иллюстрирует, как писать и читать текстовый файл в каталоге пользователя.

Mac OS X 10.5.8 если это имеет значение.

Я знаю, что это немного больше, чем типичный вопрос, заданный здесь, но я хотел избежать очевидных вопросов «вы попробовали».

Я предполагаю, что гуру собирается показать mojo запуска с простым и очевидным решением. Ну, по крайней мере, я буду переходить к шагу 2. запуск программ

Спасибо, JLH

ответ

0

У меня есть один и тот же вопрос. Я решил это, используя вместо этого curl.

wget http://opendata-download-metobs.smhi.se/api/version/1.0/parameter/2/station/178970/period/corrected-archive/data.csv

curl -C - -o data.csv http://opendata-download-metobs.smhi.se/api/version/1.0/parameter/2/station/178970/period/corrected-archive/data.csv

Первая линия работала для меня в терминале, но я должен был использовать второй в моей версии сценария. Одна хорошая вещь: curl разрешил мне указать имя файла, которое wget отказался.