如何使用现有的环境变量和库运行 at 命令?

如何使用现有的环境变量和库运行 at 命令?

几乎重复了这个问题但是,该帖子中的答案并没有用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=:1script2.shas

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.shpycharm.pyDISPLAYecho $DISPLAY

另一个原因是环境变量。cron$PATH作业中的变量可能不包含可执行文件所在的所有路径。也可能有库文件。

which <excutable>您可以通过键入(例如)来检查可执行文件的路径which gjs。对于库目录,变量是$LD_LIBRARY_PATH,要查看它使用的库的位置,变量是ldd $(which gjs)

然后将export PATH=$PATH:<exepath>和添加export LD_LIBRARY_PATH=<libpath>到您的at脚本中。

相关内容