Crontab语法;多个命令


14

我想获得以下命令链作为cronjob:

* * * * * source activate myenv3 && cd ~/foo/bar && python sssb.py

它可以在控制台中工作,但是我没有从cronjob获得任何输出。

我遵循了这个建议,将其替换为

* * * * * env > /tmp/env.output

找出env是否不同。除了PATH以外,我找不到任何相关的内容。所以我成立了

PATH=myPath
* * * * * source activate myenv3 && cd ~/foo/bar && python sssb.py

而且仍然没有用。最后我换成了

PATH=myPath
* * * * * source activate myenv3 && cd ~/foo/bar && python sssb.py
* * * * * env > /tmp/env.output

这次我什至没有得到env.output文件。因此,我认为我的语法有问题-看上去就像我在网上找到的多命令建议一样。

这里发生了什么?如果不是很明显,接下来我该如何找出错误?

PATH=/usr/local/anaconda2/envs/myenv3/bin:~/.conda:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

out.err

/bin/sh: 6: /usr/local/anaconda2/envs/myenv3/bin/activate: [[: not found
/bin/sh: 15: /usr/local/anaconda2/envs/myenv3/bin/activate: [[: not found
/bin/sh: 17: /usr/local/anaconda2/envs/myenv3/bin/activate: [[: not found
Only bash and zsh are supported

Answers:


16

在Ubuntu中,默认情况下,cron守护进程使用shdash)shell 运行所有作业,dash并且没有source内置。

您需要使用POSIX方式,即.

* * * * * . activate myenv3 && cd ~/foo/bar && python sssb.py

或者,您可以将作业作为以下参数的运行bash

* * * * * "$(command -v bash)" -c 'source activate myenv3 && cd ~/foo/bar && python sssb.py'

现在,我又有了一个/tmp/env.output文件,但是主文件仍然没有输出。
FooBar '16

1
@FooBar的输出是grep SHELL /tmp/env.output什么?还要运行第一个作业,* * * * * ( . activate myenv3 && cd ~/foo/bar && python sssb.py ) >/tmp/out.err 2>&1并检查/tmp/out.err
heemayl

它说SHELL = / bin / sh。我将粘贴我的输出out.err以及实际粘贴到问题中的PATH。
FooBar '16

1
使用+1进行封装$(command -v bash) -c ' ... '-解决了整个tigaboo无需进入(并非如此)凌乱的细节。
Cbhihe '16

1
的命令-v部分"$(command -v bash)" -c '...'毫无意义。只是做bash -c '...'
盖尔哈
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.