У меня ужасное время, когда я получаю сценарий bash, который использует wget для запуска в качестве задания launchd. Скрипт предназначен для автоматизации загрузки ежедневного кроссворда New York Times. Обратите внимание, что вам нужна подписка (ИМЯ ПОЛЬЗОВАТЕЛЯ и ПАРОЛЬ), чтобы это работало.
Оригинальный сценарий (который находится по адресу http://web.mit.edu/lizdenys/Public/crossword) отлично работает и является впечатляющим и поучительным примером написания сценариев bash (по крайней мере, для меня). Вот оригинал. Я модифицировал его для своего использования, включив пользователя и пароль и прокомментировав шаги для загрузки чего угодно, кроме PDF-версии (мне нравится карандаш и бумага).
-=-=-=-=-=-=начать скрипт bash-=-=-=-=-=-=
#!/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
-=-=-=-=-=-=конец скрипта bash-=-=-=-=-=-=
Я сделал необходимую правку и скрипт запустился из командной строки С ПЕРВОЙ ПОПЫТКИ!
Поскольку у меня нет доступа в Интернет каждый день и поскольку (насколько я знаю) головоломки больше не доступны на следующий день после их появления, я решил, что автоматизирую задание, чтобы запускать его каждый день. Я использовал cron (для инкрементного резервного копирования на Sparcstation) без каких-либо проблем (используя make для выбора файлов для записи на ленту - это показывает мой опыт), но НЕТ, Apple хочет, чтобы я использовал launchd. Я всегда рад узнать что-то новое и полезное, поэтому моей задачей было узнать достаточно о launchd и 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-=-=-=-=-=-=
Вот мои наблюдения:
-сценарий нормально запускается из командной строки (с необходимыми модами) -скрипт завершается с ошибкой при запуске из launchd (выход 1) как задание для каждого пользователя (~/Library/LaunchAgents/). Системный журнал показывает, что файл, который ищет grep и содержит два основных бита данных, никогда не записывается в целевой каталог («токен grep login.html — такого файла нет»).
Первоначально я пытался запускать задание StartCalendarInterval в 09:00 каждый день, но когда это не удалось, я переключился на OnDemand, используя загрузку/выгрузку launchctl для отладки. Кое-что, что я пробовал:
Указание путей в plist (ошибка, выход, рабочий каталог) - не помогает
Изменение владельца и разрешений для целевого каталога. - нет помощи
Изменение путей в скрипте на абсолютные (без ~, без $HOME, без ., без относительных). - без помощи https://myaccount.nytimes.com/auth/login\-O/Users/me/Documents/misc/nytimes_xword/login.html &>/dev/null>
Я прочитал справочные страницы для 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, если это имеет значение.
Я знаю, что это немного длиннее, чем типичный вопрос, заданный здесь, но я хотел избежать очевидных вопросов «вы пробовали это».
Я предполагаю, что гуру раскроет прелести launchd простым и очевидным решением. Ну, по крайней мере, я перейду к запуску шага 2.
спасибо, джлх