我遇到一个问题,我使用 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"
它确实像广告中说的那样好用。我不确定你的环境里发生了什么。