No Unix, existe alguma maneira de um processo alterar as variáveis de ambiente de outro (assumindo que todas estejam sendo executadas pelo mesmo usuário)? Uma solução geral seria a melhor, mas se não, o que dizer do caso específico em que um é filho do outro?
Edit: Que tal via gdb?
Respostas:
Via gdb:
Este é um hack bastante desagradável e só deve ser feito no contexto de um cenário de depuração, é claro.
fonte
ptrace: Operation not permitted
Você provavelmente pode fazer isso tecnicamente (veja outras respostas), mas pode não ajudá-lo.
A maioria dos programas espera que env vars não possam ser alterados externamente após a inicialização, portanto, a maioria provavelmente irá apenas ler os vars em que estão interessados na inicialização e inicializar com base nisso. Portanto, alterá-los posteriormente não fará diferença, já que o programa nunca os relê.
Se você postou isso como um problema concreto, provavelmente deveria adotar uma abordagem diferente. Se fosse apenas por curiosidade: Boa pergunta :-).
fonte
Substancialmente, não. Se você tinha privilégios suficientes (root ou por aí) e vasculhou / dev / kmem (memória do kernel), e fez alterações no ambiente do processo, e se o processo realmente referenciou novamente a variável de ambiente depois (ou seja, o processo ainda não tinha tirado uma cópia do env var e não estava usando apenas essa cópia), então talvez, se você fosse sortudo e inteligente, e o vento estivesse soprando na direção certa, e a fase da lua estivesse correta, talvez, você pode conseguir algo.
fonte
gdb
no processo pai e é programado para fazer a mudança e funciona sem travar o processo pai. OK - você provavelmente pode fazer isso, mas não é algo que você fará de forma rotineira. Para fins práticos, portanto, a resposta continua sendo não . O resto da resposta cobre as alternativas off-the-wall teoricamente possíveis, um tanto impraticáveis.Citando Jerry Peek:
A única coisa que você pode fazer é alterar a variável de ambiente do processo filho antes de iniciá-lo: ele obtém a cópia do ambiente pai, desculpe.
Consulte http://www.unix.com.ua/orelly/unix/upt/ch06_02.htm para obter detalhes.
Apenas um comentário sobre a resposta sobre o uso de / proc. Em linux / proc é suportado, mas não funciona, você não pode alterar o
/proc/${pid}/environ
arquivo, mesmo se você for root: é absolutamente somente leitura.fonte
Eu poderia pensar em uma maneira bastante artificial de fazer isso, e não funcionará para processos arbitrários.
Suponha que você escreva sua própria biblioteca compartilhada que implementa 'char * getenv'. Em seguida, você configura env 'LD_PRELOAD' ou 'LD_LIBRARY_PATH'. vars para que ambos os processos sejam executados com a biblioteca compartilhada pré-carregada.
Dessa forma, você terá essencialmente um controle sobre o código da função 'getenv'. Então, você poderia fazer todos os tipos de truques desagradáveis. Seu 'getenv' pode consultar o arquivo de configuração externo ou segmento SHM para valores alternativos de env vars. Ou você pode fazer pesquisa / substituição regexp nos valores solicitados. Ou ...
Não consigo pensar em uma maneira fácil de fazer isso para processos arbitrários em execução (mesmo se você for root), exceto reescrever o vinculador dinâmico (ld-linux.so).
fonte
Ou faça com que seu processo atualize um arquivo de configuração para o novo processo e:
fonte
Não tão longe quanto o que sei. Na verdade, você está tentando se comunicar de um processo para outro, que exige um dos métodos IPC (memória compartilhada, semáforos, soquetes, etc.). Tendo recebido dados por um desses métodos, você pode definir variáveis de ambiente ou realizar outras ações mais diretamente.
fonte
Se o seu unix suporta o sistema de arquivos / proc, então é trivial LER o env - você pode ler o ambiente, a linha de comando e muitos outros atributos de qualquer processo que você possui dessa forma. Mudando ... Bem, eu posso pensar em uma maneira, mas é uma ideia RUIM.
O caso mais geral ... Não sei, mas duvido que haja uma resposta portátil.
(Editado: minha resposta original assumiu que o OP queria LER o env, não alterá-lo)
fonte
O UNIX está cheio de comunicação entre processos. Verifique se sua instância de destino tem algum. O Dbus está se tornando um padrão no IPC "desktop".
Eu mudo as variáveis de ambiente dentro do gerenciador de janelas Awesome usando awesome-client com é um Dbus "remetente" de código lua.
fonte
Não é uma resposta direta, mas ... Outro dia Raymond Chen tinha um raciocínio [baseado no Windows] em torno disso : -
Em outras palavras, qualquer um desses recursos do kernel seria
No entanto, a razão mais provável é simplesmente que há casos de uso limitados para tal recurso.
fonte
Parece que putenv não funciona agora, mas setenv sim. Eu estava testando a resposta aceita enquanto tentava definir a variável no shell atual sem sucesso
e a variante como funciona:
fonte