Как может быть возможно изменить некоторую переменную в env
уже запущенном процессе, например, через /proc/PID/environ?
«файл» read-only
.
Нужно изменить или сбросить переменную DISPLAY в длительном пакетном задании, не убивая его.
environment-variables
proc
Marcos
источник
источник
xpra
может быть интересно.xpra
звучит полезно. Обычно я перенаправляю на не-пользовательские дисплеи, размещенныеXvfb
илиXephyr
, но сегодня я забыл и запустил из cli, а не cron / at для устранения проблем с выводом, поэтому меня это раздражало:0
Ответы:
Вы не можете сделать это без неприятных хаков - для этого нет API, нет способа сообщить процессу, что его среда изменилась (так как это на самом деле невозможно в любом случае).
Даже если вам удастся это сделать, невозможно быть уверенным, что это будет иметь какой-либо эффект - процесс вполне мог бы кэшировать переменную среды, которую вы пытаетесь протолкнуть (поскольку ничто не должно быть в состоянии изменить ее). ).
Если вы действительно хотите это сделать и готовы собрать кусочки, если что-то пойдет не так, вы можете использовать отладчик. Смотрите, например, этот вопрос переполнения стека:
есть ли способ изменить переменные среды другого процесса?
По существу:
Другими возможными функциями, которые вы можете попытаться вызвать, являются
setenv
илиunsetenv
.Пожалуйста, имейте в виду, что это может не сработать или иметь страшные последствия, если целевой процесс делает «интересные» вещи со своим блоком среды. Сначала проверьте его на некритических процессах, но убедитесь, что эти процессы тестирования максимально приближены к тому, который вы пытаетесь проткнуть.
источник
Нет необходимости делать это, если пакетное задание может считывать данные из файловой системы для получения изменений. Просто запустите задание с путем к временному уникальному каталогу и передайте тот же путь к дочернему сценарию оболочки. Скрипт заблокирует файл в этом каталоге и запишет файл с новыми значениями рядом с файлом блокировки. Время от времени сценарий задания блокирует один и тот же файл, анализирует и считывает изменения из файла значений. Чтобы узнать, как сделать блокировку в оболочке Unix, просто найдите
unix shell lock file
илиbash lock file
, уже существует множество решений для этого.Преимущества этого решения:
Вопросы реализации ниже:
flock
в Linux для достижения эффекта исключения в Windows есть встроенное исключение)Реализация хранится здесь: https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts/Tools
bash
Реализация:set_vars_from_locked_file_pair.sh
testlock.sh
То же самое в Windows (как пример переносимости):
set_vars_from_locked_file_pair.bat
testlock.bat
Для записи файлов просто сделайте таким же образом блокировку в своем коде.
источник