cronjobs 运行的 shell 和环境变量与 中提供给我的完全不同gnome-terminal
。如何在与在终端中运行 cronjob 相同的情况下运行它?
我当前的解决方案是运行 cronjob env DISPLAY=:0.0 gnome-terminal -e my-command
,但这会弹出一个 gnome 终端,这是不可接受的。
答案1
您可以在 的顶部显式指定所需的环境变量crontab
,也可以从某个地方获取环境。
要显式添加环境变量,您可以在脚本顶部使用如下行(在 hashbang 之后):
FOO=bar
要从文件中获取它们,请使用如下行:
. /foo/bar/baz
为了回应您对要包含的问题的编辑gpg-agent
,您应该能够~/.gpg-agent-info
获取来源$GPG_AGENT_INFO
。如果不存在,请尝试gpg-agent
以开头--write-env-file "${HOME}/.gpg-agent-info"
。
答案2
您是正确的,进程不应该能够查看其他进程环境。这很大程度上是设计使然。但是,export
将整齐地打包您的环境以供其他东西使用。
你能做的就是在你的.bashrc:
[[ $DISPLAY ]] && export > ~/.cron_bread_crumbs/gonme_env
然后让你的 cron 作业简单地选择它。
. /home/user/.cron_bread_crumbs/gnome_env
该文件将充满这样的行:
declare -x ENV_VARIABLE="value"
当然,值会被引用。这就是我所说的“包装整齐”的意思。
获取此值(从而调用declare -x
导出)意味着从父 cron 启动(并且可能分离)的所有后续进程也将继承这些值。
不过,这有点笨拙,因为它假设您已经打开一个 gnome 终端,导致在 cron 运行之前刷新值。然而,在 cron 作业中添加一点理智应该不会太难。
您的另一个选择是在后台启动一些在将环境转储到命名管道时阻塞的东西,然后让 cron 作业从那里获取它。不管怎样,问题在于确保通过 Gnome 终端发生某些事情,以便 cron 作业获取变量。