Czy w systemie Unix istnieje sposób, w jaki jeden proces może zmienić zmienne środowiskowe innego (zakładając, że wszystkie są uruchamiane przez tego samego użytkownika)? Najlepsze byłoby rozwiązanie ogólne, ale jeśli nie, to co z konkretnym przypadkiem, w którym jedno jest dzieckiem drugiego?
Edycja: A może przez gdb?
Odpowiedzi:
Przez gdb:
Jest to dość paskudny hack i oczywiście należy go robić tylko w kontekście scenariusza debugowania.
źródło
'putenv' has unknown return type; cast the call to its declared return type
:; w takich przypadkach powinieneś zmienićputenv
połączenie na to:call (int) putenv ("env_var_name=env_var_value")
Prawdopodobnie możesz to zrobić technicznie (zobacz inne odpowiedzi), ale może ci to nie pomóc.
Większość programów spodziewa się, że zmiennych środowiska nie można zmienić z zewnątrz po uruchomieniu, dlatego większość prawdopodobnie po prostu odczyta zmienne, którymi są zainteresowane, podczas uruchamiania i zainicjuje na tej podstawie. Zatem ich późniejsza zmiana nie będzie miała znaczenia, ponieważ program nigdy ich nie przeczyta ponownie.
Jeśli opublikowałeś to jako konkretny problem, prawdopodobnie powinieneś przyjąć inne podejście. Gdyby to było tylko z ciekawości: fajne pytanie :-).
źródło
Zasadniczo nie. Jeśli miałeś wystarczające uprawnienia (root lub w pobliżu) i grzebałeś w / dev / kmem (pamięć jądra) i wprowadziłeś zmiany w środowisku procesu, i jeśli proces faktycznie ponownie odwoływał się później do zmiennej środowiskowej (to znaczy proces nie zrobiłeś jeszcze kopii env var i nie używałeś tylko tej kopii), to może, jeśli miałeś szczęście i spryt, a wiatr wiał we właściwym kierunku, a faza księżyca była, być może, możesz coś osiągnąć.
źródło
gdb
się w procesie nadrzędnym i jest zaprogramowany w celu wykonania zmiany, i działa bez awarii procesu nadrzędnego. OK - prawdopodobnie możesz to zrobić, ale nie jest to coś, co masz zamiar robić rutynowo. Dlatego ze względów praktycznych odpowiedź brzmi: nie . Reszta odpowiedzi obejmuje teoretycznie możliwe poza ścianą, nieco niewykonalne w praktyce alternatywy.Cytując Jerry'ego Peeka:
Jedyne, co możesz zrobić, to zmienić zmienną środowiskową procesu potomnego przed jego uruchomieniem: przepraszam, pobiera on kopię środowiska nadrzędnego.
Szczegółowe informacje można znaleźć pod adresem http://www.unix.com.ua/orelly/unix/upt/ch06_02.htm .
Tylko komentarz do odpowiedzi na temat używania / proc. Pod linux / proc jest obsługiwany, ale nie działa, nie możesz zmienić
/proc/${pid}/environ
pliku, nawet jeśli jesteś rootem: jest on absolutnie tylko do odczytu.źródło
Mógłbym wymyślić dość wymyślny sposób, aby to zrobić, i nie zadziała w przypadku arbitralnych procesów.
Załóżmy, że piszesz własną bibliotekę współdzieloną, która implementuje 'char * getenv'. Następnie ustaw „LD_PRELOAD” lub „LD_LIBRARY_PATH” env. vars, aby oba procesy działały z wstępnie załadowaną biblioteką współdzieloną.
W ten sposób będziesz mieć kontrolę nad kodem funkcji „getenv”. Następnie można było robić różnego rodzaju paskudne sztuczki. Twój „getenv” może sprawdzić w zewnętrznym pliku konfiguracyjnym lub segmencie SHM alternatywne wartości zmiennych env. Lub możesz przeszukać / zamienić regexp na żądanych wartościach. Albo ...
Nie mogę wymyślić prostego sposobu na zrobienie tego dla dowolnie działających procesów (nawet jeśli jesteś rootem), poza przepisaniem dynamicznego linkera (ld-linux.so).
źródło
Lub poproś proces o zaktualizowanie pliku konfiguracyjnego dla nowego procesu, a następnie:
źródło
O ile wiem, nie. Naprawdę próbujesz komunikować się z jednego procesu do drugiego, co wymaga jednej z metod IPC (pamięć współdzielona, semafory, gniazda itp.). Po otrzymaniu danych jedną z tych metod można było ustawić zmienne środowiskowe lub wykonać inne czynności bardziej bezpośrednio.
źródło
Jeśli twój unix obsługuje system plików / proc, to po prostu CZYTAĆ env - możesz czytać środowisko, wiersz poleceń i wiele innych atrybutów dowolnego procesu, który posiadasz w ten sposób. Zmieniam to ... Cóż, przychodzi mi do głowy sposób, ale to ZŁY pomysł.
Bardziej ogólny przypadek ... Nie wiem, ale wątpię, czy istnieje przenośna odpowiedź.
(Edytowano: moja pierwotna odpowiedź zakładała, że OP chciał ODCZYTAĆ env, a nie go zmienić)
źródło
UNIX jest pełen komunikacji międzyprocesowej. Sprawdź, czy Twoja docelowa instancja ma jakieś pliki. Dbus staje się standardem w "desktopowych" IPC.
Zmieniam zmienne środowiskowe wewnątrz Awesome Window Managera używając awesome-client z "nadawcą" Dbus kodu Lua.
źródło
Nie jest to bezpośrednia odpowiedź, ale ... Raymond Chen miał uzasadnienie [oparte na Windows] dotyczące tego tylko niedawno : -
Innymi słowy, takie udogodnienia jądra byłyby
Jednak najbardziej prawdopodobnym powodem jest po prostu to, że istnieją ograniczone przypadki użycia takiej funkcji.
źródło
Wygląda na to, że putenv teraz nie działa, ale setenv działa. Testowałem zaakceptowaną odpowiedź, próbując bez powodzenia ustawić zmienną w bieżącej powłoce
i wariant, jak to działa:
źródło