几乎重复了这个问题一但是,该帖子中的答案并没有用at
命令解决环境问题。
问题描述:我想使用at
命令运行我的 shell 脚本作为计划作业。我的所有 shell 脚本都可以在 Ubuntu 10.04 和 20.04(3 个不同的系统)的正常终端中顺利运行。我得到了所有预期的结果。但是,当我使用 运行我的 shell 脚本时at
,它根本无法运行。以下 3 个案例说明了at
适用于简单操作,但无法运行复杂操作。
情况1
at
使用简单的脚本。以下是我的 shell 的所有内容script1.sh
:
echo $(date) > ~/Desktop/time.txt
运行后at now + 1 minutes -f ~/script1.sh
,它会将时间保存到 time.txt 文件中。太好了,这意味着我的at
功能很好。
案例 2
at
一个简单的脚本失败了。以下是我的 shell 的所有内容script2.sh
:
echo $(date) > ~/Desktop/time.txt
pycharm.sh
运行时at now + 1 minutes -f ~/script2.sh
,它将时间保存到 time.txt 文件中,但 Pycharm 从未打开。然而,如果我sh script2.sh
不使用运行at
,一切都会顺利进行,我会在 time.txt 文件中获取时间,并且 Pycharm 会正常打开。我认为这只是意味着at
没有在现有的终端环境中获取所有变量。一旦我添加export DISPLAY=:1
到script2.sh
as
echo $(date) > ~/Desktop/time.txt
export DISPLAY=:1
pycharm.sh
即可at now + 1 minutes -f ~/script2.sh
正常运行。
案例 3
我需要按照at
计划作业运行以下 shell 脚本script3.sh
:
gjs -numberofsplits 50 -clusterplatform condor -condorscript condor.script main.mac > ./output0.txt 2>&1
condor_submit main.submit > ./output1.txt 2>&1
请注意,所有这些脚本都可以在带有 的终端中正常运行sh script.sh
,然而,使用运行脚本at now + 1 minutes -f ~/script3.sh
,它会抛出一个保存在output0.txt
文件中的错误,它说
gjs: error while loading shared libraries: libG4global.so: cannot open shared object file: No such file or directory
我也尝试使用 gjs 和 condor_submit 的绝对script3.sh
路径
/home/albert/Products9/Gate/Gate-9.0-install/bin/gjs -numberofsplits 50 -clusterplatform condor -condorscript condor.script main.mac > ./output0.txt 2>&1
/usr/bin/condor_submit > ./output1.txt 2>&1
但它抛出了同样的错误。
已经尝试过的解决方案
到目前为止,我认为问题描述得很好。我认为导致此问题的原因是at
命令无法像在普通终端中那样访问所有环境变量。
以下是我尝试过的解决方案这里at
,希望通过添加来获取所有暴露的环境变量
source $HOME/.profile
或者
source $HOME/.bashrc
到shell脚本的开头。然而,这并没有解决或缓解任何问题。
寻求帮助
能否请您这位这方面的专家帮忙解决这个问题?因为这个问题可能也会困扰很多其他用户。非常感谢。
答案1
其中一个原因是at
命令调度程序默认未设置为在 GUI 显示屏上运行。如果您在行上方export DISPLAY=:0
添加,它应该可以工作。您可以通过在终端窗口中输入来检查变量。myscrpit.sh
pycharm.py
DISPLAY
echo $DISPLAY
另一个原因是环境变量。cron$PATH
作业中的变量可能不包含可执行文件所在的所有路径。也可能有库文件。
which <excutable>
您可以通过键入(例如)来检查可执行文件的路径which gjs
。对于库目录,变量是$LD_LIBRARY_PATH
,要查看它使用的库的位置,变量是ldd $(which gjs)
。
然后将export PATH=$PATH:<exepath>
和添加export LD_LIBRARY_PATH=<libpath>
到您的at
脚本中。