Сценарий bash/wget запускается из командной строки, но не запускается под launchd — выходные файлы не записываются

У меня ужасное время, когда я получаю сценарий 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.

спасибо, джлх


person diogenes    schedule 14.07.2015    source источник


Ответы (1)


У меня такая же проблема. Я решил это, используя 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 отказался сделать.

person mercergeoinfo    schedule 30.10.2015