Pergunta

No Unix, existe alguma maneira que um processo pode mudar outra está variáveis ??de ambiente (assumindo que eles estão todos a ser executado pelo mesmo usuário)? A solução geral seria melhor, mas se não, o que sobre o caso específico em que um é uma criança do outro?

Edit:? Que tal via gdb

Foi útil?

Solução

Via gdb:

(gdb) attach process_id

(gdb) call putenv ("env_var_name=env_var_value")

(gdb) detach

Este é bastante um corte desagradável e só deve ser feito no contexto de um cenário de depuração, é claro.

Outras dicas

Você provavelmente pode fazê-lo tecnicamente (veja outras respostas), mas pode não ajudá-lo.

A maioria dos programas irá esperar que env vars não pode ser alterado a partir do exterior após a inicialização, portanto, a maioria provavelmente só irá ler a vars eles estão interessados ??em na inicialização e inicializar com base nisso. Então alterá-los depois não vai fazer a diferença, uma vez que o programa nunca re-lê-los.

Se você postou isso como um problema concreto, você provavelmente deve ter uma abordagem diferente. Se fosse só por curiosidade: questão Nice: -).

Substancialmente, não. Se você tinha privilégios suficientes (raiz, ou por aí) e remexia / dev / kmem (memória do kernel), e você fez alterações para o ambiente do processo, e se o processo realmente re-referenciados a variável de ambiente depois (isto é, o processo já não tivesse tomado uma cópia do env var e não estava usando apenas essa cópia), então talvez, se você teve sorte e inteligente, eo vento soprava na direção certa, e a fase da lua estava correto, talvez, você pode conseguir algo.

Citando Jerry Peek:

Você não pode ensinar um cachorro velho novos truques.

A única coisa que você pode fazer é mudar a variável de ambiente do processo de criança antes iniciá-lo:. Torna-se a cópia do ambiente pai, desculpe

http://www.unix.com.ua/orelly /unix/upt/ch06_02.htm para mais detalhes.

Apenas um comentário sobre a resposta sobre como usar / proc. Sob linux / proc é suportado, mas, ele não funciona, você não pode alterar o arquivo /proc/${pid}/environ, mesmo se você for root:. É absolutamente read-only

Eu poderia pensar na forma bastante planejado para fazer isso, e não vai funcionar para processos arbitrários.

Suponha que você escrever sua própria biblioteca compartilhada que 'char * getenv' implementos. Em seguida, você configurar 'LD_PRELOAD' ou env 'LD_LIBRARY_PATH'. vars de modo que ambos os processos são executados com a sua biblioteca compartilhada pré-carregado.

Desta forma, você terá essencialmente um controle sobre o código da função 'getenv'. Então, você poderia fazer todos os tipos de truques sujos. Seu 'getenv' poderia consultar o arquivo de configuração externa ou segmento SHM para valores alternativos de env vars. Ou você poderia fazer pesquisa de expressão regular / substituir sobre os valores solicitados. Ou ...

Eu não posso pensar de uma maneira fácil de fazer isso por processos em execução arbitrárias (mesmo se você for root), curta de reescrever vinculador dinâmico (ld-linux.so).

Ou obter o seu processo para atualizar um arquivo de configuração para o novo processo e, em seguida:

  • executar um kill -HUP sobre o novo processo de reler o arquivo de configuração atualizado, ou
  • tem o processo de verificar o arquivo de configuração para atualizações de vez em quando. Se as alterações forem encontrados, então reler o arquivo de configuração.

Não tanto quanto eu sei. Realmente você está tentando comunicar-se de um processo para outro que exige um dos métodos IPC (memória compartilhada, semáforos, tomadas, etc.). Tendo recebido os dados por um desses métodos que você poderia, então, definir variáveis ??de ambiente ou executar outras ações mais diretamente.

Se o seu unix suporta o / proc sistema de arquivos, então é trivial para ler os env - você pode ler o ambiente, linha de comando, e muitos outros atributos de qualquer processo você possui essa maneira. Mudá-lo ... Bem, eu posso pensar de uma maneira, mas é uma ideia BAD.

O caso mais geral ... Eu não sei, mas eu duvido que haja uma resposta portátil.

(Editado: minha resposta inicial assumiu o OP queria ler o env, não mudá-lo)

UNIX está cheio de comunicação entre processos. Verifique se a sua instância de destino tem algum. Dbus está se tornando um padrão em "desktop" IPC.

variáveis ??I ambiente mudança dentro do gerenciador de janelas impressionante usando incrível para o cliente com um "remetente" Dbus de código Lua.

Não é uma resposta direta, mas ... Raymond Chen tinha um [baseado em Windows] raciocínio em torno isso só no outro dia : -

... Embora certamente há maneiras incompatíveis de fazê-lo ou formas que o trabalho com a ajuda de um depurador, não há nada que é suportado para acesso programático a linha de comando de outro processo, pelo menos nada fornecido pelo kernel. ...

Isso não existe é uma conseqüência do princípio de não manter o controle de informações que você não precisa. O kernel não tem necessidade de obter a linha de outro processo de comando. Ele toma a linha de comando passado para a função CreateProcess e copiá-lo para o espaço de endereço do processo que está sendo lançado, em um local onde a função GetCommandLine pode recuperá-la. Uma vez que o processo pode acessar a sua própria linha de comando, as responsabilidades do kernel são feito.

Uma vez que a linha de comando é copiado para o espaço de endereço do processo, o processo pode até escrever para a memória que mantém a linha de comando e modificá-lo. Se isso acontecer, então a linha de comando original é perdido para sempre; a única cópia conhecida foi substituído.

Em outras palavras, quaisquer instalações do kernel seria

  • difícil de implementar
  • potencialmente uma preocupação de segurança

No entanto, a razão mais provável é simplesmente que há casos de uso limitado para uma instalação desse tipo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top