Назад | Перейти на главную страницу

Процессы, порожденные набором задач, не соблюдают переменные среды

Я столкнулся с проблемой, когда программа, созданная компилятором Intel, которую я запускаю с набором задач, помещала свои временные файлы в рабочий каталог вместо / tmp (определяется переменной среды TMPDIR). Если запускается сам по себе, он работает правильно. При запуске с набором задач (например,

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 внутри своего сценария, а затем использую набор задач для создания нового процесса, он не знает об этой переменной:

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

При запуске список экспортируемых переменных не включает TMPDIR. Он правильно работает с любой другой экспортируемой переменной окружения. Если я различаю вывод:

export

и

taskset -c 1 bash -c export

Потом вижу, что есть 4 изменения. Экспорт, порожденный набором задач, не имеет LD_LIBRARY_PATH, NLSPATH (переменная компилятора Intel), SHLVL - 3 вместо 1, а TMPDIR отсутствует. Кто-нибудь может сказать мне, почему?

На самом деле я не вижу здесь доказательств того, что $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"

Работает как рекламируется. Я не уверен, что происходит в вашем окружении.