由任务集生成的进程不遵守环境变量

由任务集生成的进程不遵守环境变量

我遇到一个问题,我使用 taskset 运行的英特尔编译器生成的程序将其临时文件放入工作目录而不是 /tmp(由环境变量 TMPDIR 定义)。如果单独运行,它可以正常工作。如果使用 taskset 运行(例如

taskset -c 0 <program>

然后它似乎完全忽略了 TMPDIR 环境变量。然后我通过编写一个快速 bash 脚本来验证这一点,如下所示:

test.sh的内容:

#!/bin/bash
echo $TMPDIR

单独运行时:

$ export TMPDIR=/tmp
$ test.sh
/tmp

通过任务集运行时:

$ export TMPDIR=/tmp
$ taskset -c 1 test.sh
""

另一个测试。如果我在脚本中导出 TMPDIR 变量,然后使用 taskset 生成一个新进程,它不知道该变量:

#!/bin/bash
export TMPDIR=/tmp
taskset -c 1 sh -c export

运行时,导出的变量列表不包括 TMPDIR。它可以与任何其他导出的环境变量一起正常工作。如果我比较以下输出:

export

taskset -c 1 bash -c export

然后我看到有 4 处更改。任务集生成的导出没有 LD_LIBRARY_PATH、NLSPATH(英特尔编译器变量)、SHLVL 为 3 而不是 1,并且缺少 TMPDIR。有人能告诉我为什么吗?

答案1

我实际上没有看到您环境中设置的证据。如果我将其设置为本地 shell 变量,$TMPDIR我可以复制您描述的行为,如下所示:TMPDIR

$ TMPDIR=/tmp
$ taskset -c 0 sh -c 'echo TMPDIR: $TMPDIR'

得出的结果是:

TMPDIR:

但如果我将其导出TMPDIR到环境中,它就会按预期工作:

$ TMPDIR=/tmp
$ export TMPDIR
$ taskset -c 0 sh -c 'echo TMPDIR: $TMPDIR'
TMPDIR: /tmp

你确定TMPDIR你的环境中设置了它吗?你可以使用以下env命令转储当前环境:

$ env | grep TMPDIR
TMPDIR=/tmp

如果我采用您更新的脚本:

#!/bin/bash
export TMPDIR=/tmp
taskset -c 1 sh -c export

并在我的 CentOS 系统上运行它:

$ sh taskset.sh  | grep TMPDIR
export TMPDIR="/tmp"

它确实像广告中说的那样好用。我不确定你的环境里发生了什么。

相关内容