как совместно использовать переменные среды между оболочками как globals, связанный с основным pid?

Хорошо я нашел решение: смонтируйте каталог с помощью cifs, а не smbfs, и он работает! Я добавил следующую строку к fstab:

//windows-computer/share    /home/jj/smbShare   cifs username=jj,password=***,perm,iocharset=utf8,uid=jj,gid=users,nounix,noserverino  0  0

Чтобы постараться не помещать Ваш пароль Windows в fstab файл, можно использовать учетный файл: http://anothersysadmin.wordpress.com/2007/12/17/howto-mount-samba-shares-in-fstab-using-a-credential-file/

7
03.05.2017, 23:47
7 ответов

Можно записать среду в файл с export -p и читайте его назад периодически в других экземплярах с . (включать команда). Но как Вы отмечаете, если будут параллельные модификации, то результат не будет симпатичен.

Если Вы хотите, чтобы модификации распространили немедленно, необходимо будет использовать обертку вокруг export встроенный, который также распространяет изменения в других оболочках. На Linux можно использовать flock утилита.

global_export () {
  {
    flock 0
    . /path/to/env
    [ $# -eq 0 ] || export "$@"
    export -p >/path/to/env
  } </path/to/env
}

Обратите внимание, что необходимо будет звонить global_export каждый раз, когда Вы присваиваете новое значение экспортируемой переменной.

Это довольно неуклюже. Вероятно, что существует лучший способ решить Вашу проблему. Самый очевидный путь состоит в том, чтобы иметь любую команду, использует те, которые переменная среды считала конфигурационные файлы вместо этого.

4
27.01.2020, 20:17

В дополнение только к использованию flock из ответа Giles я сделал бы что-то подобное следующему:

Зарегистрируйте обработчик сигналов для перезагрузки файла:

reload_env() {
 flock -s 3
 . /path/to/env
 flock -u 3
}
trap reload_env USR1

Функция, чтобы выписать файл и отправить a SIGUSR1 ко всем оболочкам, уведомляющим их для перезагрузки файл:

export_env() {
 flock 3
 export -p >/path/to/env
 flock -u 3
 fuser -k -USR1 /path/to/env
}

Откройте файл, но ничего не сделайте с ним. Это именно так что fuser сможет сигнализировать об этой оболочке:

exec 3>>/path/to/env

Порядок несколько важен. По крайней мере, exec ... часть должна быть после trap ... часть. Иначе мы могли открыть файл и затем сообщаться fuser звоните, прежде чем мы зарегистрировали наш обработчик сигналов.

Примечание: Код полностью не тестируется, но принцип стоит.
NOTE2: Этот пример кода предназначен для удара.

2
27.01.2020, 20:17
  • 1
    , поэтому везде, где код выполняется, который захватил сигнал, будет выполняться быстро, обновляя переменные среды! Я думаю в коде, что по любой причине зависит, что огибающее значение var является тем же, это было в beggining функции, может доставить некоторые неприятности tho.. но вместо этого булевская переменная могла быть установлена с Вашим кодом, потребовать, чтобы огибающий Вар был загружен в безопасной точке кода (как конец цикла); будет иметь тот же результат; я должен дать попытку на этом, Спасибо! –  Aquarius Power 20.08.2013, 03:14

С fish оболочка, используйте универсально ограниченные по объему переменные:

set -U var value

Конечно, тот единственные работы через fish оболочки выполняются тем же пользователем.

Если Вы хотите связать его с основным pid, включайте его в имя переменной

set -U m${masterpid}var value
2
27.01.2020, 20:17

Я хотел бы указать на Вас на именованные каналы с этой целью. Вот один аккуратный пример для рассмотрения.

Именованные каналы создаются командой:

mkfifo pipe_name

Можно просто записать в него:

echo "This text goes to the pipe" > pipe_name

С другой стороны, можно читать из канала как:

read line < pipe_name;
echo $line

Можно создать несколько каналов на основе того, сколько делают оболочки Вы хотите, чтобы они связались. Хорошие вещи о каналах состоят в том, что они не просто переменные. Можно на самом деле передать любые данные между процессами. Можно передать целые файлы, строки текстов, независимо от того, что Вы желаете. Я верю с этим в памяти, можно упростить сценарии много. Я могу вообразить, если Ваши переменные указывают на местоположение данных или файл, и другой сценарий должен будет считать или получить их, можно непосредственно передать данные/файл, даже не нуждаясь в переменной.

1
27.01.2020, 20:17
  • 1
    ! интересный, как 1-й терминал ожидал, я даю команду чтения на другом. Что я вижу, первоначально то, что это - "одно к одной" коммуникации, и замораживает 1-й терминал до 2-х чтений канал, и также мне нужны "Многие Многим" коммуникация (многие могут читать, многие могут записать, одновременно но синхронизировались); но действительно это новое знание может быть полезным Спасибо! –  Aquarius Power 21.09.2013, 09:16

Если ksh93 является опцией, существует определенно способ реализовать то, что Вы хотите с методом считывания и функциями дисциплины метода set, которые получали бы/хранили бы значение переменной из/в совместно используемую память.

См. https://stackoverflow.com/questions/13726293/environment-variables-to-be-used-across-multiple-korn-ksh93-shell-scripts-get для деталей

В отличие от в других отношениях полезного fish универсальная функция переменных, у Вас есть доступ к реализации, таким образом, можно ограничить совместное использование значения группой процессов, связанных с основным pid через некоторый механизм в варианте использования, при хранении единственного имени к переменной.

1
27.01.2020, 20:17
  • 1
    , который очень интересен, поскольку я видел, Вы просто перенаправляете способ, которым он установил и получает значение переменной; действительно я не ограничил для удара... хорошо, хороший теперь, я знаю об этом; интересно, мог ли удар иметь что-то подобное однажды.. –  Aquarius Power 21.09.2013, 02:44
  • 2
    Это могло бы в конечном счете. Функции дисциплины находятся в bash список пожеланий. bash использование для выбора более поздних функций ksh сначала реализованный. –  jlliagre 21.09.2013, 10:39

Принятие во внимание комментариев, что Вы хотите основной IPC между сценариями оболочки. Я просто записал бы в файлы (с переименовыванием для атомарности)

varf=$(mktemp ./myvars.XXXXXX)
echo myvar=newval > $varf
mv -T -- $varf ./myvars

И имейте источник читателей./myvars периодически.

IPC намного легче с, например, Python и многопроцессорный модуль.

0
27.01.2020, 20:17

Существует также этот ScriptEchoColor проекта:

Это может автоматический создавать и справляться для Вас, текстового файла DB. На сценарии первого показа будет создан файл BD, другие сценарии будут символьная ссылка на тот файл как их собственный DB для управления значениями переменных, и таким образом, оба смогут обмениваться информацией.

Простой пример совместного использования с этими файлами там в папке в качестве примера: secExplShareEnvVarsA.sh, secExplShareEnvVarsB.sh

И синхронизируемый (безопасное и последовательное чтение-запись) совместно использовал доступ DB там также: secExplSyncedShareEnvVarsA.sh, secExplSyncedShareEnvVarsB.sh

0
27.01.2020, 20:17

Теги

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