在 WSL Ubuntu 20.04 上,我有两个脚本(一个 sh 和一个 python),如果我使用 bash 启动它们,它们可以完美运行,但使用 cron 则不行。
只有第一个脚本 (bash) 成功后,第二个脚本 (python) 才会运行。因此我使用了一个&&
运算符。
如果我运行/mnt/c/folder/first.sh && /home/myself/miniconda3/bin/python /mnt/c/folder/second.py
,但是如果我在 crontab 中有同样的这行,第二个脚本不起作用。
我尝试将该行包含/home/myself/miniconda3/bin/python /mnt/c/folder/second.py
到 bash 脚本中,但同样不起作用。
这个 python 脚本利用环境变量来工作,我想知道这是否是原因。虽然我尝试. $HOME/.profile;
在上述命令之前将其包含在 crontab 中;但没有成功。
答案1
这个python脚本利用环境变量来工作,我想知道这是否是原因。
是的,当通过/bin/sh
命令执行时(anacron
默认情况下执行),该 shell 不是登录 shell,因此~/.profile
无法获取来源。
尽管我曾尝试在上述命令之前的 crontab 中包含 .$HOME/.profile;,但没有成功。
这对我有用。我将其添加export abc=123
到我的~/.profile
并将以下内容添加到/etc/crontab
:
* * * * * username . $HOME/.profile && true && echo $abc >> $HOME/crontest
结果~/crontest
正确显示了123
每分钟过去的情况。
另一种方法是强制sh
作为登录 shell 运行(-l
),并通过以下方式传入脚本-c
:
* * * * * username sh -lc 'true && echo $abc >> $HOME/crontest'