【问题标题】:Windows 7 Task Scheduler BASH Script FailsWindows 7 任务计划程序 BASH 脚本失败
【发布时间】:2013-09-12 12:38:39
【问题描述】:

为了使用 rsync,我创建了一个 BASH 脚本。它从 WIN 7 中的 Cygwin shell 运行良好,但从 WIN 7 任务计划程序运行时失败。我的任务计划程序脚本很简单:

c:\cygwin\bin\bash.exe -l -c "~user/rsync_Windows_Backup 2>&1 >> ~user/Documents_cron.log"

初始目录设置为 C:\Cygwin\bin。

我的 BASH 脚本是一个典型的 rsync 命令,带有 [options] SRC DEST 和一些相关的内务管理。

“rsync_Windows_Backup”BASH 脚本中的 rsync 命令是:

/bin/time -f "\nElapse (hh:mm:ss.ss) %E" \ 
rsync.exe -v -rltz --chmod=a=rw,Da+x -u "$SRC" "$DEST" >> "$LOG" \ 
2 >> "$LOG"

$ ./rsync_Windows_Backup - succeeds.  

但任务计划程序作业失败,因为它找不到 BASH 脚本引用的 DEST 文件夹。当我从 BASH 命令行执行“cd DEST”时,文件夹可用并且可以写入。

我应该添加更多细节,发送者是一个 WIN 7 桌面,它映射到一个带有驱动器映射 J: 的 Vista 桌面接收器。 BASH 脚本启动但失败:

rsync: writefd_unbuffered failed to write 4 bytes to socket [sender]: Broken pipe (32)
rsync: mkdir "/cygdrive/J/DocumentsBackup" failed: No such file or directory (2) rsync error:  error in file IO (code 11) 

假设这是问题的根源,我尝试了几种方法来影响 WIN 7 处理映射和权限的方式。到目前为止,似乎没有任何帮助。

另一个特点是完全相同的 BASH 脚本和任务计划程序作业在 WIN Vista 商业版中确实成功了。所以我假设我在 WIN 7 中缺少某些东西。

我很困惑,可以使用一些指导。

谢谢。

【问题讨论】:

  • 你确定应该是~user/rsync_Windows_Backup 而不是~/rsync_Windows_Backup 吗?
  • 感谢您的反馈。我明白你的意思,我也可以尝试这种语法。不过它确实像在 Vista 中编写的那样工作。
  • 使用 ./ 没有帮助。还是被难住了。
  • 不应该是~/
  • 我发布了一个答案。我希望它澄清。

标签: windows bash scheduler


【解决方案1】:

我现在可以根据需要从任务调度程序在 Win 7 中使用它。感谢 LinuxQuestionsorg 的 @netubsi 和 @firerat 以及 @konsolebox 提出的解决方案。

这是我所做的:

cmd /c net use T: '\\server\share' # 为 Cygwin 创建了一个单独的临时共享 DEST="/cygdrive/T/User/FolderBackup/" # 在目的地使用临时共享 rsync -avuz --copy-links "$SRC" "$DEST" # 做备份 cmd /c net use T: /delete # 删除临时共享

似乎在 WIN 7 中,在 Windows 中创建的共享不适用于 Cygwin 脚本,如果它是从 Win 7 任务调度程序启动的。如果脚本是从 Cygwin 命令行启动的,则它是可用的。看来这在 Win Vista 中也不是问题。

这对我来说似乎很奇怪。也许我缺少另一种解释。但是,我很高兴能有这个工作!

【讨论】:

  • 老问题,但我刚刚遇到了 win10 64 位的这个确切问题,这解决了它。现在我的 rsync 从 Windows 调度程序运行。谢谢!
【解决方案2】:

你也可以直接在cygwin中使用网络地址:

DEST="//server/share/User/FolderBackup"

Cygwin 在 /cygdrive 下安装本地和映射驱动器。在win7中使用taskscheduler,如果你列出/cygdrive的内容,你看到的都是本地驱动器???

【讨论】:

    【解决方案3】:

    第一个选项是运行你的脚本

    c:\cygwin\bin\bash.exe -l -c "~/rsync_Windows_Backup >> ~/Documents_cron.log 2>&1"
    

    如果你也想捕获stderr输出,你必须把它放在前面复制文件的fd,而不是stdout。

    确保rsync_Windows_Backup 具有可执行权限。运行 ls -l ~/rsync_Windows_Backup 应该会显示它。

    如果不起作用,请尝试使用绝对路径。在您的 Cygwin 屏幕上,当前目录在提示符类型 pwd 中显示 ~,这将显示类似

    User@System ~
    $ pwd
    /home/User
    

    以此为例,您的命令现在应该如下所示:

    c:\cygwin\bin\bash.exe -l -c "/home/User/rsync_Windows_Backup >> /home/User/Documents_cron.log 2>&1"
    

    【讨论】:

    • 我会尝试您的建议并反馈。我认为我已经拥有的可能是等效的,但我的不起作用。我怀疑问题可能在于 WIN 7 和 Vista 在 NTLM 等领域的差异。我的语法在 Vista 中工作。
    • 我意识到我应该补充几点说明,我总结的 rsync 错误可能不清楚。备份在 Microsoft LAN 上的两个节点之间。接收器是 Vista,发送器是 WIN 7。通过映射到 J: 的驱动器到达接收器。发送方 BASH 脚本似乎确实在发送方上启动,但由于 rsync 错误而失败: rsync: writefd_unbuffered 无法将 4 个字节写入套接字 [sender]: Broken pipe (32); rsync:mkdir“/cygdrive/J/DocumentsBackup”失败:没有这样的文件或目录(2)
    • 我尝试了建议的更改,但得到了相同的结果。关于 NTLM 和权限等的任何想法。谢谢。
    • @dpminusa 对不起。我一直在阅读您的回复并思考,但实际上我没有想法。不知何故,我认为您可以在 superuser.com 中询问有关它的主题。至少你现在知道这不是一个真正的脚本问题。
    • 顺便说一句,我没有得到太多东西是如何映射的,但是您确定 J: 已安装并且您可以通过 cygwin 终端手动访问它吗?例如cd /cygdrive/J
    猜你喜欢
    • 2012-03-26
    • 2011-02-18
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2012-11-17
    • 2017-04-19
    • 2015-10-21
    相关资源
    最近更新 更多