Сбрасывание переменной среды с пустым названием

tl; доктор: Посмотрите решение при Обновлении 2 ниже.

Это не действительно ответ к сожалению, или по крайней мере не хорошие новости: я получаю чувство, что это никогда не может работать так или иначе — я просто нахожу, что немного трудно для веры, так как я, конечно, думаю, что это работало в прошлом!

Это - то, что обычно работает, и почему: Большинство читателей SD-карты ноутбука. Вы найдете, что включаете SD-карту, udev видит его, Linux просканирует его для разделов, и автомонтирование будет просто работать. Почему это работает? Посмотрите на lsusb прежде и после вставки карты. Вы отметите, что без включенной SD-карты, USB-устройство не существует. Таким образом, при вставке SD-карты существует полноценное событие замены в горячем режиме USB.

Картридер в моем мониторе, кажется, не работает как это, это всегда там. И я не могу заставить это генерировать любое событие, когда я вставляю SD-карту. Я запустил с рассмотрения системных журналов, затем на udevadm monitor, затем usbmon для необработанной регистрации событий USB. Никакая удача, там, кажется, не, любой вставляет/извлекает уведомление/событие вообще, или от картридера в моем мониторе или от дешевого DealExtreme один в моем ПК.

Момент я пытаюсь получить доступ к неструктурированному устройству, ядро, просыпается, и раздел появляется. Точно так же звоните udevadm trigger и это отметит устройство. Выньте карту, и ничего не происходит, пока я не пытаюсь получить доступ к устройству снова, и ядро понимает, что пошло.

Что интересно самостоятельно, теперь, как это, возможно, когда-либо работало (то есть, если я не составляю эту память)? Возможно, некоторый демон раньше опрашивал неструктурированное устройство каждые несколько секунд и прекратил делать это? Трудно найти любую документацию относительно этого, действительно.

Обновление № 1

Выше все с ядром акций Debian. Я только что сделал некоторые эксперименты с ядром Ubuntu, где замена в горячем режиме SD-карты, кажется, работает. И не удивительно, в usbmon Я вижу опросы каждые две секунды. Который также объясняет, почему карты сразу не обнаруживаются, но с небольшой задержкой.

Опрос, кажется, сделан ядром, так как это происходит даже в однопользовательском режиме без процесса пространства пользователя, делающего что-либо кроме застревания в a select() цикл. Я не смог выяснить, где в ядре это сделано, я обновлю это сообщение, если я узнаю.

Обновление № 2

Важное различие, кажется, /sys/block/sd?/events_poll_msecs. На моем поле Debian это-1, на поле Ubuntu это - 2000. Это udev правило, кажется, делает это:

# enable in-kernel media-presence polling
ACTION=="add", SUBSYSTEM=="module", KERNEL=="block", ATTR{parameters/events_dfl_poll_msecs}=="0", ATTR{parameters/events_dfl_poll_msecs}="2000"
ACTION=="add", ATTR{removable}=="1", ATTR{events_poll_msecs}=="-1", ATTR{events_poll_msecs}="2000"
3
12.01.2015, 00:19
2 ответа

В сценарии автоматической модернизации в /etc/cron.daily/apt используются интервалы обновления, выраженные в днях, поэтому установить более частое значение, чем один день, невозможно.

Можно использовать стандартный cron - поместите его в /etc/cron.d :

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 0-23/4 * * * root   apt-get -q update && apt-get dist-upgrade -yq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold"

Настройте команду в соответствии с вашими потребностями.

-121--60641-

CPU

Процесс может снизить свой приоритет CPU (но не уменьшить его, man 2 setpriority ). Кроме того, он может усыпить себя в течение определенного времени. Но он не может решить, как экономить время ЦП другим процессам.

Ситуацию с потоками см. в комментарии psusi.

память Новый процесс получает начальный объем ОЗУ (однако не знаю, является ли это значением ядра по умолчанию или заданным в данных заголовка двоичного файла). Если требуется больше оперативной памяти, процесс запрашивает у ядра дополнительную информацию (см. man 2 mmap ).

Как и во время ЦП, процесс не может решить, какой процесс получит больше памяти, если освободит часть.

Выход из процесса

Если процесс завершает работу (либо по собственному решению, либо в результате прерывания), то ядро автоматически освобождает свои ресурсы. Процесс может освободить «все» его ОЗУ перед выходом, но нет причин для этого. Вместо этого используются вызовы _ exit или exit _ group .

-121--210006-

Переменные среды не должны иметь пустого имени, поэтому многие утилиты не поддерживают их.

Команда env из coreutils GNU поддерживает установку переменной среды с пустым именем, но не отменяет ее установку. Это жучок.

$ env '=wibble' env |grep wibble                                 
=wibble
$ env '=wibble' env -u '' env
env: cannot unset `': Invalid argument

Общие оболочки также не могут отменить установку пустого имени. Это нормально, так как пустое имя не должно использоваться в качестве переменной среды и не может использоваться в качестве переменной оболочки. Зш - единственный багги в жребии: он делает вид, что делает работу, но на самом деле ничего не делает.

$ env '=wibble' dash -c 'unset ""'
dash: 1: unset: : bad variable name
$ env '=wibble' bash -c 'unset ""'
bash: line 0: unset: `': not a valid identifier
$ env '=wibble' ksh -c 'unset ""'
ksh[1]: unset: : invalid variable name
$ env '=wibble' mksh -c 'unset ""'
mksh: : is read only
$ env '=wibble' posh -c 'unset ""'
posh: unset:  is read only
$ env '=wibble' zsh -c 'unset ""'
$ env '=wibble' zsh -c 'unset ""; env' | grep wibble
=wibble

Python, как вы заметили, выходит из строя при обнаружении пустого имени переменной среды .

У Perl такой проблемы нет, поэтому это может быть решением для вас. Следует отметить, что для изменения среды необходимо выполнить новую оболочку и использовать внешний процесс.

perl -e 'delete $ENV{""}; exec $ARGV[0] @ARGV' "$SHELL" "-$-"
2
27.01.2020, 21:27

Вы можете сделать:

import os
for k in os.environ.keys():
     print repr(k)
     del os.eniviron[k]
print os.environ
os.environ.clear()

Я не уверен, почему прямой os.environ.clear () бросает ошибку, я начал вышеупомянутый код цикла, чтобы увидеть, могу ли я найти ключ, вызывающий эта проблема. Пожалуйста, не то, что вам нужно указать .keys () , просто итерация , просто итерация для k в os.environ: даст ошибку, потому что вы изменяете словарь, над которым вы итерация. .keys () создает копию).

0
27.01.2020, 21:27

Теги

Похожие вопросы