Aqui está o meu problema - estou tentando escrever um pequeno script wrapper que adiciona um argumento de linha de comando quando o Xorg é chamado (não tenho acesso à fonte do chamador). Parecia bastante simples, mas o problema que estou executando agora é que o chamador está esperando por um USR1
sinal do Xorg. Na página de manual do XSERVER:
SIGUSR1
Este sinal é usado de forma bastante diferente de qualquer um dos acima. Quando o servidor é iniciado, ele verifica se herdou SIGUSR1 como SIG_IGN em vez do SIG_DFL usual. Nesse caso, o servidor envia um SIGUSR1 para seu processo pai depois de configurar os vários esquemas de conexão. O Xdm usa esse recurso para reconhecer quando a conexão com o servidor é possível.
Eu pensei que poderia simplesmente capturar o sinal e encaminhá-lo:
#!/bin/bash
parent_trap(){
echo sending USR1 to $PPID &> /tmp/wrapper.log
kill -USR1 $PPID
}
trap "parent_trap" USR1
Xorg $@ (extra stuff) &
wait
Mas é claro que isso não funciona, pois o próprio script é iniciado pelo chamador ignorando USR1
. ACHO que o que preciso fazer é fazer com que o script pare de ignorar o sinal, mas também de alguma forma inicie o Xorg com USR1
ignorado (para acionar o comportamento da página man.)
Isso é possível no Bash/alguma outra linguagem de script? Por algumas razões, espero evitar uma solução compilada, mas não é impensável. Também é possível que eu esteja pensando completamente sobre isso errado e haja alguma outra maneira de ir USR1
do Xorg para o chamador.
Seu novo roteiro
Em vez de tentar fazer algo sofisticado com os sinais, por que não fazer isso:
Como funciona
Para ilustrar o que está acontecendo com o acima, aqui está um exemplo mais elaborado que ajuda a mostrar a mecânica do
exec
script acima.Isso iniciará o Xorg como você especificou, mas como estamos usando o
exec
comandoXorg
assumirá o mesmo PID e substituirá nossoxorg.bash
script por ele mesmo.NOTA: A intenção das últimas 3 linhas acima é demonstrar que o
xorg.bash
não está mais em reprodução/execução após a execução doexec sleep ...
comando.Exemplo
Primeiro executamos nosso script:
Se fôssemos monitorar isso em outro shell usando
fase 1 - xorg.bash pré-executivo fase 2 - xorg.bash pós-executivops auxf
, veríamos isso.Observe na fase 1 que
xorg.bash
tem um PID de 22471, mas na fase 2,exec sleep 5
agora tem o mesmo PID, 22471.As linhas depois
exec ...
A função do
exec
comando faz com que o shell atual seja substituído por outro executável:Como consequência disso, quaisquer comandos no
xorg.bash
nunca são executados porque no ponto ondeexec ....
está,xorg.bash
deixa de existir como processo, tendo sido substituído pelosleep
comando.Referências