上传从终端运行,但不是cron调用

以下是我的up427.sh脚本,从digitalroncean服务器上的ubuntu 12.06下的cron调用。

该脚本运行并上传到youtube从该终端上的bash up427.sh该滴,但不是当bash up427.sh完成从该crontab上的液滴

它回应了一个错误126到错误输出文件,我称之为cx.txt

我知道这意味着调用的126命令不能执行/ dev / null权限问题或命令不是可执行文件

请记住它在我运行时运行

bash up427.sh

从液滴终端,它工作并上传到YouTube,所以当从终端使用bash运行脚本时,终端上的sh命令和语法是正确的

我是根。

我的crontab是我使用crontab -e创建的通用的crontab,所以我相信它具有所有权限。

以下是从crontab到up427.sh的调用

SHELL=/bin/bash
HOME=/root/
#PATH=/sbin:/bin:/usr/sbin:/usr/bin:/root
MAILTO=”me@mail.com”
#PATH=/usr/local/share/youtube_upload:/root:/sbin:/bin:/usr/sbin:/usr/bin
#Uses client secrets at: /usr/local/share/youtube_upload/client_secrets.json
#Uses credentials fileat : /root/.youtube-upload-credentials.json



57 * * * *  bash /root/up427.sh; echo $?; echo$*; echo $$ > /root/up427dirfromcron.txt

(显然,我将57调整到我希望运行的任何时间)

该脚本从一开始就执行cd / root,这是所有这些文件和相关子目录所在的位置。

另外我已经让crontab尝试home = / anmd hpme = / root /并且它没有什么区别

所有文件都通过其特定的子目录来调用,以避免cron作业子目录vageries(直到我做到这一点)

我也尝试过使用和不使用所有sh标头。 没有不同。

开始真正的逐字记录脚本文件up427.sh(最近我开始在凌晨3点把头发扯掉)

SHELL=/bin/bash
HOME=/root
#PATH=/sbin:/bin:/usr/sbin:/usr/bin:/root
#MAILTO=”me@mail.com”
PATH=/usr/local/share/youtube_upload:/root:/sbin:/bin:/usr/sbin:/usr/bin


bash2run="youtube-upload --client-secrets=/usr/local/share/youtube_upload/client_secrets.json --credentials-file=/root/.youtube-upload-credentials.json 
--title=mytitle --privacy=private /root/thefileiwanttouploadwhichisfineandworksfromcommandline.mp4 "


echo $bash2run  >/root/cx.txt


youtube-upload --client-secrets=/usr/local/share/youtube_upload/client_secrets.json --credentials-file=/root/.youtube-upload-credentials.json 
--title=mytitle --privacy=private /root/thefileiwanttouploadwhichisfineandworksfromcommandline.mp4

echo $?  >>/root/cx.txt  (this echoes the error 126 when runby cron)

echo $*  >> /root/cx.txt  

echo $$  >> /root/cx.txt

echo "---------end of up427.sh-------------------"  >>/root/cx.txt

逐字sh文件的结尾up427.sh

再次,cx.txt文件只是将错误保存在crontab下运行sh文件,所以我可以看到没有发生什么。

我试图在这个sh文件中使用目录的所有目录来调用youtube-upload。 当这个sh被cron调用时,没有任何工作

/ root / youtube-upload下有一个子目录
我甚至没有看到那里奇怪的节目。

该程序将引用变量中的所有后面的参数。

请注意我有变量那里只是为了将它导出到cx.txt错误日志文件,但我实际上使用bash调用程序,你可以在下一行看到。

我试过(在脚本中)bash“you-upload --arguments”,没有任何qoutes。 双引号。 单引号等在sh文件中。

我已经在路径中包含了我能想到的所有东西。 似乎没有区别。

该方案来自

https://github.com/tokland/youtube-upload

我在这里查看了很多crontab答案,但没有一个适用,并让你从cronjob时间表上传工作!

是的,程序会被调用。

cx.txt中的错误表明。

我的目标结构是

/home/root/
then under that
drwxr-xr-x  7 root root     4096 Apr 24 16:04 google-api-php-client
drwxr-xr-x  3 root root     4096 Apr 24 17:40 .subversion
drwxr-xr-x  3 root root     4096 Apr 24 17:40 install
drwxr-xr-x  6 root root     4096 Apr 24 17:46 youtube-upload
-rw-r--r--  1 root root    17833 Apr 24 17:47 master.zip.1
drwxr-xr-x  6 root root     4096 Apr 24 17:47 youtube-upload-master
 -rw-r--r-- 1 root root   855 Apr 28 12:36 up427.sh

另外还有/ youtube-upload的目录

root@(none):~/youtube-upload# ls -l -t -r -a 
total 52
-rw-r--r--  1 root root  1247 Apr 24 17:46 setup.py
-rw-r--r--  1 root root  4920 Apr 24 17:46 README.md
-rw-r--r--  1 root root   725 Apr 24 17:46 .gitignore
drwxr-xr-x  2 root root  4096 Apr 24 17:46 examples
-rw-r--r--  1 root root   522 Apr 24 17:46 client_secrets.json
drwxr-xr-x  2 root root  4096 Apr 24 17:46 bin
drwxr-xr-x  6 root root  4096 Apr 24 17:46 .
drwxr-xr-x  3 root root  4096 Apr 24 17:46 youtube_upload
drwxr-xr-x  8 root root  4096 Apr 24 17:46 .git
drwx------ 11 root root 12288 Apr 28 01:28 ..

请提供建议

我不知道这是否与github项目文件范围或cron范围或一些愚蠢的错字错误

当我从temrinal运行它使用

bash up427.sh

这是成功的输出

 root@(none):~# bash  up427man.sh
 Using client secrets: /usr/local/share/youtube_upload/client_secrets.json
 Using credentials file: /root/.youtube-upload-credentials.json
 Start upload: /root/thefileiwanttouploadwhichisfineandworksfromcommandline.mp4
 Video URL: https://www.youtube.com/watch?v=(theyoutubevideonumber)
 (randomcodespecifictoyoutubeasuthwhichiwontshowhere)

有些人要求以下

echo $SHELL
/bin/bash
root@(none):~# ps -p $$
 PID TTY          TIME CMD
20144 pts/1    00:00:00 bash
root@(none):~# which bash
/bin/bash

更多的想法

我开始认为它可能无法解析youtube-upload -arguments -arguments-arguments的命令

我在考虑使用cron调用时需要引用的部分,而不是在终端完成bash sh文件时。 只是一个猜测。 可能是完全错误的。 现在尝试各种各样的报价。

我对sh或crontab文件顶部的标题一无所知。 像bin / bash的东西,然后misisng! 等等

这可能很重要吗? 应该在crontab -e编辑文件的顶部

和我的up427.sh文件?

而奇怪的是我不能为我的生活弄清楚什么程序的名字实际上是我运行的bash或命令行运行

youtube-upload

因为这似乎是一个目录名称,我实际上找不到它所运行的程序名! 它可能是一些环境变量,当键入时调用另一个程序?

当我开始向它添加目录前言时,例如/ root / youtube-upload

我得到的东西,如“程序”youtube-upload“是一个目录”

但是这个问题是

youtube-upload --title=blahblah -- decription=blahblah

因为它显示在git页面上!

以其最纯粹的形式从命令行运行

bash up427.sh

up427.sh是

youtube-upload --client-secrets=/usr/local/share/youtube_upload/client_secrets.json --credentials-file=/root/.youtube-upload-credentials.json --title='titleonyoutube' --privacy=private /root/filetobeuploaded.mp4

多数民众赞成在没有所有的无聊发送TXT文件来显示我在cronjob下运行时的输出。

我希望有所帮助。

在运行时工作

bash up427.sh

从temrinal命令行

但是当它从crontab文件调用时它会返回一个错误127

更新

尝试在从crontab调用的脚本中使用EVAL语句之后

这是一个新的脚本,其中包含多个引用youtube-upload程序的变体,引用了许多引号变体,以查看是否有任何变化。 调用中的每个变体都在Youtube名称上命名为不同的上传名称,以便我可以看到哪些上传到YouTube。

就像以前没有任何工作时从cron调用

所以eval没有帮助。

然而,像以前一样,在同时使用新的eval和旧的echo语句时,如同之前从终端调用相同的脚本时上传的众多变体

这些是从终端调用脚本时上传的调用的变体。

如你看到的

四个使用eval工作

四个使用旧的回声方法工作

2avartest2 HD

2commbashworksvartest2 HD

avartest2 HD

commbashworksvartest2 HD

2avartest2eval HD

2commbashworksvartest2eval HD

avartest2eval HD

commbashworksvartest2eval HD

再一次,他们只有在脚本从终端运行而不是从cron运行时才起作用!

ARRGGHHHHH DOUBLE TRIPLE ARRRRGGHHHH!

这里是使用eval的许多(8)实例的新脚本,以及使用回声的同样的旧8也不起作用

(我不知道如何粘贴整个东西作为一个巨大的代码块,所以它不是缩进,因为我不能缩进所有这些线,但坦率地说,无论如何它更容易阅读。)

    commbashworks="youtube-upload --title=commbashworksvartest2eval --client-secrets=/usr/local/share/youtube_upload/client_secrets.json --credentials-file=/root/.youtube-upload-credentials.json --privacy=private /root/uptest.mp4"

eval $ commbashworks

回声

a ='youtube-upload --title = avartest2eval --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials.json --privacy = private /root/uptest.mp4'

评估$ a

回声

b =“/ root / youtube-upload --title = bvartest2eval --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials.json - -privacy = private /root/uptest.mp4“

eval $ b

回声

c ='/ root / youtube-upload --title = cvartest2eval --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials.json - -privacy = private /root/uptest.mp4'

eval $ c

回声

d =“../ root / youtube-upload --title = dvartest2eval --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials。 json --privacy = private /root/uptest.mp4“

eval $ d

回声

e ='.. / root / youtube-upload --title = evartest2eval --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials。 json --privacy = private /root/uptest.mp4'

eval $ e

回声

commbashworks =“youtube-upload --title = 2commbashworksvartest2eval --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials.json --privacy =私人uptest.mp4“

eval $ commbashworks

回声

a ='youtube-upload --title = 2avartest2eval --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials.json --privacy =私人uptest.mp4'

评估$ a

回声

b =“/ root / youtube-upload --title = 2bvartest2eval --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials.json - -privacy = private uptest.mp4“

eval $ b

回声

c ='/ root / youtube-upload --title = 2cvartest2eval --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials.json - -privacy = private uptest.mp4'

eval $ c

回声

d =“../ root / youtube-upload --title = 2dvartest2eval --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials。 json --privacy = private uptest.mp4“

eval $ d

回声

e ='.. / root / youtube-upload --title = 2evartest2eval --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials。 json --privacy = private /uptest.mp4'

eval $ e

回声

commbashworks =“youtube-upload --title = commbashworksvartest2 --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials.json --privacy = private /root/uptest.mp4“

不要取代那个人

echo $($ commbashworks)

回声

a ='youtube-upload --title = avartest2 --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials.json --privacy = private /root/uptest.mp4'

echo $($ a)

回声

b =“/ root / youtube-upload --title = bvartest2 --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials.json - -privacy = private /root/uptest.mp4“

echo $($ b)

回声

c ='/ root / youtube-upload --title = cvartest2 --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials.json - -privacy = private /root/uptest.mp4'

echo $($ c)

回声

d =“../ root / youtube-upload --title = dvartest2 --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials。 json --privacy = private /root/uptest.mp4“

echo $($ d)

回声

e ='.. / root / youtube-upload --title = evartest2 --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials。 json --privacy = private /root/uptest.mp4'

echo $($ e)

回声

commbashworks =“youtube-upload --title = 2commbashworksvartest2 --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials.json --privacy =私人uptest.mp4“

echo $($ commbashworks)

回声

a ='youtube-upload --title = 2avartest2 --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials.json --privacy =私人uptest.mp4'

echo $($ a)

回声

b =“/ root / youtube-upload --title = 2bvartest2 --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials.json - -privacy = private uptest.mp4“

echo $($ b)

回声

c ='/ root / youtube-upload --title = 2cvartest2 --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials.json - -privacy = private uptest.mp4'

echo $($ c)

回声

d =“../ root / youtube-upload --title = 2dvartest2 --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials。 json --privacy = private uptest.mp4“

echo $($ d)

回声

e ='.. / root / youtube-upload --title = 2evartest2 --client-secrets = / usr / local / share / youtube_upload / client_secrets.json --credentials-file = / root / .youtube-upload-credentials。 json --privacy = private /uptest.mp4'

echo $($ e)

回声

更新解决方案!

更正它没有工作。 它删除了文件。


我的第一个猜测是你的默认shell不是Bash,并且当脚本在cron下执行时,它将在不同的shell下运行。 我猜这是因为你遇到一些与CLI到CRON不同的原因是:

  • 我注意到,当交互式运行时,你通过bash up427.sh指定bash; 和
  • 您不要在脚本的顶部指定shell。
  • 为了帮助我们排除故障:

  • 你可以添加你的crontab条目到你的文章吗?
  • 你能告诉我们当你在终端运行echo $SHELL时看到了什么吗?
  • UPDATE

    根据您的更新,它看起来像一个不匹配的shell可能不是根本原因。 鉴于不断变化的错误代码(从126到127),必须有更多的参与。 要完全排除不匹配的shell,您可以从目标服务器的终端尝试以下操作(以运行crontab的同一用户的身份登录到终端)并报告输出:

    $ echo $SHELL
    $ ps -p $$
    $ which bash
    

    更新#2
    我会推荐使用eval 。 为此,您需要将完整的命令构建为一个将传递给eval的字符串。 这将被用来代替echo $bash2run >/root/cx.txt 。 这个想法的一个基本例子是:

    my_args='-al'
    eval "ls ${my_args}"
    

    如果你从这个基本的例子开始工作,我想你会得到它的工作。

    对于使用evalexecsource小型但内容丰富的讨论,我建议你阅读bash shell上的这个线程:'exec','eval','source' - 寻求帮助理解

    另外,我建议通过添加-x标志来在调试模式下运行脚本:

    bash -x up427.sh
    

    更新解决方案! 以及解决方案事实上删除了一些随机文件,所以我把它拿走,直到我找出原因。

    我之前留下了这个重要笔记

    ANYTIME您使用CRON我无法强调足够的重要性:完全指定所有sh文件的完整路径,参数中的文件以及您想要输出的任何文件的完整路径,例如>> /mydirectorywhereiwantit/output.txt在您的crontab文件和你的sh文件脚本文件。

    据我所知, cron会在任何目录中查找文件和写入文件,而这些文件恰好在进行打击时可能会非常混乱,如果这是与通常从终端输入的目录不同的目录。 所以,请详细说明所有文件在CRONTAB和被调用的SH脚本文件和自变量中的路径!

    感谢John Mark Mitchell提供如此多的可能解决方案。

    链接地址: http://www.djcxy.com/p/42705.html

    上一篇: upload runs from terminal but not cron call

    下一篇: Redirecting tail output into a program