bash / wget脚本从命令行运行但无法在launchd下运行 - 未写入的输出文件

时间:2015-07-14 21:30:43

标签: macos bash wget launchd

我很难得到一个使用wget作为launchd作业运行的bash脚本。该脚本旨在自动下载每日纽约时报填字游戏。请注意,您需要订阅(USERNAME和PASSWORD)才能使其正常工作。

原始脚本(生活在http://web.mit.edu/lizdenys/Public/crossword)效果很好,是bash脚本的一个令人印象深刻的教育示例(至少对我而言)。这是原始的。我修改它以供我使用,包括用户,传递和评论下载除PDF版本之外的任何步骤(我喜欢铅笔和纸)。

- = - = - = - = - = - =开始bash脚本 - = - = - = - = - = - =

#!/bin/bash

# crossword,
# a wget-based nytimes crossword downloader

# Liz A. Denys (liz@lizdenys.com)
# 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之一:

- = - = - = - = - = - =开始.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从命令行运行正常(带有必要的mod) 从launchd(退出1)作为每用户作业(〜/ Library / LaunchAgents /)运行时,-script失败。系统日志显示grep查找并包含两个基本数据位的文件永远不会写入目标目录(&#34; grep token login.html - 没有这样的文件&#34;)。

我最初尝试在每天0900作为StartCalendarInterval作业运行,但是当失败时,我使用launchctl load / unload切换到OnDemand进行调试。我尝试过的事情:

在plist中指定路径(错误,输出,工作目录) - 没有帮助

更改目标目录的所有权和权限。 - 没有帮助

将脚本中的路径更改为绝对路径(no~,no $ HOME,no。,no relative)。 - 没有帮助 https://myaccount.nytimes.com/auth/login \   -O /Users/me/Documents/misc/nytimes_xword/login.html& amp;&gt; / dev / null&gt;

我已经阅读了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,如果重要的话。

我知道这比这里提出的典型问题要长一些,但我想避免显而易见的问题#34;你试过这个问题&#34;的问题。

我假设一个大师将用一个简单而明显的解决方案揭示launchd的魔力。好吧,至少我会继续推出第2步。

谢谢, JLH

1 个答案:

答案 0 :(得分: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拒绝这样做。