Scripts para recuperar aplicativos que retornam erráticos da hibernação (skype)

Iniciado por boladegude, 29 de Maio de 2011, 19:03

tópico anterior - próximo tópico

boladegude

Scripts para recuperar aplicativos que não retornam de forma correta da hibernação.
(Scripts to retrieve applications that don't return correctly from hibernation.)
hibernar, suspender, hibernate, suspend, em espera, resume, skype

Não sei se tem outra forma de fazer isso, se tiver uma forma mais simples gostaria de saber.

É que tem aplicativos que não retornam de forma correta da hibernação e suspend.

Então escrevi alguns scripts para solucionar este problema.
Como disse, caso haja alguma forma mais simples de fazer isso gostaria de saber.

Bem, vamos aos scripts...
(vou utilizar o aplicativo Skype como exemplo)

1)
[para quem instalou o sistema de controle remoto, este item foi abordado no post...
http://ubuntuforum-br.org/index.php/topic,50441.msg460320.html#msg460320
faça a correção por lá!
]


[Inicio Editado 21/01/2012 (bug)]
Crie os scripts deste item de acordo com as instruções do post #8
Crie o seguinte script.
As instruções de como criar estão no início do script.

------ inicio script in_out_suspend

#!/bin/bash

# sudo su
# cd /etc/pm/sleep.d
# gedit in_out_suspend &
# e coloque isto... (depois salve e execute chmod 755 in_out_suspend)
# substitua as ocorrencias de username por seu nome do diretório home

. /usr/lib/pm-utils/functions

case "$1" in
   hibernate|suspend)
       # (roda ao suspender)
       # crie o arquivo /home/username/.Xauthority
       export DISPLAY=:0.0
       export XAUTHORITY=/home/username/.Xauthority

       # assim, roda aplicativo como usuário home
       #sudo LANG=pt_BR.utf8 LANGUAGE=pt_BR:pt:en -u username -i aplicativo

       # [Editado...
       # Correção:
       # Desta forma não hiberna se o processo não está rodando no momento da hibernação por causa do erro em pkill!
       # A forma correta de finalizar os processos está colocada logo abaixo
       ## pkill -TERM skype
       #pkill -TERM aplicativo 2
       #pkill -TERM aplicativo 3 ...
       # ]


       # obs.: somente se o processo está rodando, dá um pkill no mesmo.
       processes="utorrent.exe skype"

       for i in $processes; do
         if ps -C $i >&- 2>&-
         then
           pkill -TERM $i
         fi
       done

   ;;
   thaw|resume)
       # (roda ao voltar de suspend)
       # crie o arquivo /home/username/.Xauthority
       export DISPLAY=:0.0
       export XAUTHORITY=/home/username/.Xauthority

       # assim, roda aplicativo como usuário home
       #sudo LANG=pt_BR.utf8 LANGUAGE=pt_BR:pt:en -u username -i aplicativo
   ;;
   *)
   ;;
esac

exit

------ fim script in_out_suspend

[Fim Editado 21/01/2012 (bug)]
Referência: http://ubuntuforums.org/showthread.php?t=1190894

2)
[para quem instalou o sistema de controle remoto, este item já está pronto]

Para criar um novo arquivo .Xauthority , os seguintes comandos podem ser usados...
vá para o seu diretório home e digite:

HOST=`hostname`
key1=`perl -e 'srand; printf "%08x", int(rand(4294967295))'`
key2=`perl -e 'srand; printf "%08x", int(rand(4294967295))'`
key3=`perl -e 'srand; printf "%08x", int(rand(4294967295))'`
key4=`perl -e 'srand; printf "%08x", int(rand(4294967295))'`
key=$key1$key2$key3$key4
xauth -f .Xauthority add ${HOST}/unix:0 . $key

(se o arquivo .Xauthority já não existir, sairá a mensagem a seguir)
xauth:  creating new authority file .Xauthority

Referência:
http://ubuntuforums.org/showthread.php?t=1386329

3)
crie a pasta ~/bin
crie, na pasta ~/bin, este script com o nome de skype-wrapper
------- inicio skype-wrapper
#!/bin/bash
export LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so
! ps -C skype && skype &
------- fim skype-wrapper
Referência: centenas, é só dar um google :)

Abra a pasta ~/bin, clique com o botão direito do mouse sobre skype-wrapper,
vá em Propriedades, Permissões e de permissão para execução.
(não esqueça de fazer o mesmo para todos os scripts adiante)
Nos menus do Ubuntu substitua skype por skype-wrapper !!!

------------------------------------------------------------------------
Se quiser apenas matar o aplicativo que retornará errático após hibernação sem que ele seja reiniciado automáticamente,
apenas ignore os itens 4, 5 e 6, que têm os scripts skype_init e reactivate_skype
------------------------------------------------------------------------

4)
crie, na pasta ~/bin, este script com o nome de skype_init
-------- inicio skype_init
#!/bin/bash
# Nome desse arquivo: skype_init
# inicialização de skype ao ligar o computador ou reiniciar sessão

# Em aplicativos de sessão colocar
# Nome: skype_init
# Comando: skype_init
# Comentário: inicializa skype

# inicializa skype
killall reactivate_skyp # Editado: cortada a última letra para ficarem só 15 letras
killall skype # mata aplicativo errático em sessão reiniciada (**no caso** do aplicativo skype, ele é encerrado ao reiniciar a sessão)
reactivate_skype &
-------- fim skype_init
Referência: Eduardo/boladegude

5)
Como mencionado no interior do script acima
Em aplicativos de sessão colocar
Nome: skype_init
Comando: skype_init
Comentário: inicializa skype

6)
crie, na pasta ~/bin, este script com o nome de reactivate_skype

-------- inicio reactivate_skype

#!/bin/bash

# nome deste script: reactivate_skype

# Reabilita o skype se por algum motivo estiver encerrado...
# por exemplo, em um resume de suspend ou hibernate,
# nos quais o skype recebeu um killall (porque o processo skype volta errático de um suspend).
# Não dá certo lançar skype no shell script de resume do suspend,
# mesmo com sudo -u -i, porque nesse shell ficam faltando informações importantes
# da sessão do X iniciada em seguida na tela.
# O skype precisa ser chamado dentro da sessão do X.
# Então o presente script reinicia o skype dentro da sessão do X.
#
# O script skype_init, nos aplicativos de sessão, reinicializa
# o presente script ao ligar o computador e ao reiniciar a sessão.

#======================================== (consistencia)
# reabilita skype no caso de resume de suspend ou hibernate e ao iniciar a sessão.
#======================================== (inicio)

while true ## Editado: true estava num subshell: while (true)
do
sleep 15 # aumentando para 15 segundos ocupa menos do processador
if ! ps -C skype >&- 2>&-
then
 skype-wrapper
fi
done

#======================================== (fim)

-------- fim reactivate_skype
Referência: Eduardo/boladegude


7)
Na janela do Skype, marque a opção [V] Conectar ao iniciar o Skype

8)
De forma geral estes scripts podem ser utilizados para qualquer aplicativo.
É só mudar o nome dos scripts e do aplicativo sendo encerrado e reiniciado nos scripts.

Ou seja,
  Troque
skype_init
reactivate_skype e
skype
  por
aplicativo_init
reactivate_aplicativo e
aplicativo

Pronto, agora seu aplicativo skype estará sempre funcional, mesmo após hibernar, suspender, reiniciar a sessão ou desligar.

Seriam bem vindos "um ou dois" comentários tipo - funcionou na minha máquina.
E comentários sobre possíveis problemas.
Become an Ubuntu user. Don't just use it as a virtual machine.
If you have some space in your HD then dual boot it with Windows or Mac.
It's a fine system. You shall be willing to study a little, but is worth your effort.

vampire_thunder

A maior dificuldade, mesmo, ao meu ver, é fazer o hibernar e suspender funcionarem corretamente.

boladegude

#2
Citação de: vampire_thunder online 29 de Maio de 2011, 21:31
A maior dificuldade, mesmo, ao meu ver, é fazer o hibernar e suspender funcionarem corretamente.

Olá vampire_thunder,

No caso das placas nvidia agp o problema da hibernação está resolvido completamente no item 6) do primeiro post do tópico...
http://ubuntuforum-br.org/index.php/topic,48383.msg282905.html#msg282905

Para achar pela pesquisa digite "suspend nvidia".
Este tópico é bem antigo mas continua atualíssimo e é solução quanto ao problema da nvidia agp.

Continuo utilizando este tópico para configurar o hibernate/suspend nas placas nvidia agp até o dia de hoje, e em todas as versões do Ubuntu.

Espero que isto ajude bastante gente.

keywords: suspend, hibernate, em espera, hibernação, nvidia, agp, solução.

Abraço,
boladegude.
Become an Ubuntu user. Don't just use it as a virtual machine.
If you have some space in your HD then dual boot it with Windows or Mac.
It's a fine system. You shall be willing to study a little, but is worth your effort.

Tota

Citação de: vampire_thunder online 29 de Maio de 2011, 21:31
A maior dificuldade, mesmo, ao meu ver, é fazer o hibernar e suspender funcionarem corretamente.

Ola,

Apenas para agregar, lembro que estas duas situações dependem de swap, e nestes casos, o dobro de ram deve ser adicionado a swap para hibernar/suspender visto que, no momento de hibernar/suspender, toda a memoria ram é lida e descarregada na partição swap onde os dados ficam armazenados até a "recuperação" do sistema na saída do estado de hibernação/suspensão.

Como o GNU/Linux aceita varias partições swap, pode ser feita uma swap "de testes" num pendrive de uns 8 gigas, adicionar este pen ao arquivo fstab e verificar se melhoram as dificuldades de entrar em espera/hibernação.

Caso seja um problema de falta de swap, ele se resolverá, então cria-se uma swap maior em disco.

O uso de swap em pendrives diminui a vida destes componentes, não sendo aconselhável seu uso de forma permanente devido aos ciclos de leitura/gravação.

Maquinas configuradas com acpi=off, nolapic, noacpi, etc. terão dificuldades ou impossibilidades de hibernação/suspensão.

Ao amigo boladegude, parabéns se foi voce quem fez o script. Se não foi, parabéns pela iniciativa em postar, e neste caso, solicito citar a fonte (ou fontes) de onde extraiu a informação. Além de previsto nas regras do forum, prestigia o autor do mesmo.

Se voce o autor, peço ainda que inclua seu nome no inicio do script, abaixo de seu inicio (#!/bin/bash) com seu nome/nick para os devidos créditos, afinal é de sua propriedade.

[]'s

boladegude

Citação de: Tota online 29 de Maio de 2011, 22:13
Citação de: vampire_thunder online 29 de Maio de 2011, 21:31
A maior dificuldade, mesmo, ao meu ver, é fazer o hibernar e suspender funcionarem corretamente.

Ola,

Apenas para agregar, lembro que estas duas situações dependem de swap, e nestes casos, o dobro de ram deve ser adicionado a swap para hibernar/suspender visto que, no momento de hibernar/suspender, toda a memoria ram é lida e descarregada na partição swap onde os dados ficam armazenados até a "recuperação" do sistema na saída do estado de hibernação/suspensão.

Como o GNU/Linux aceita varias partições swap, pode ser feita uma swap "de testes" num pendrive de uns 8 gigas, adicionar este pen ao arquivo fstab e verificar se melhoram as dificuldades de entrar em espera/hibernação.

Caso seja um problema de falta de swap, ele se resolverá, então cria-se uma swap maior em disco.

O uso de swap em pendrives diminui a vida destes componentes, não sendo aconselhável seu uso de forma permanente devido aos ciclos de leitura/gravação.

Maquinas configuradas com acpi=off, nolapic, noacpi, etc. terão dificuldades ou impossibilidades de hibernação/suspensão.

Ao amigo boladegude, parabéns se foi voce quem fez o script. Se não foi, parabéns pela iniciativa em postar, e neste caso, solicito citar a fonte (ou fontes) de onde extraiu a informação. Além de previsto nas regras do forum, prestigia o autor do mesmo.

Se voce o autor, peço ainda que inclua seu nome no inicio do script, abaixo de seu inicio (#!/bin/bash) com seu nome/nick para os devidos créditos, afinal é de sua propriedade.

[]'s

Oi Tota,

Os scripts são de minha autoria mesmo.
Vou fazer o que você solicitou quanto ao nome/nick.
A parte do Xauthority é praticamente minha também, pois a fonte é muito vaga, mas vou referenciar.
E o script in_out_suspend olhei em duas ou três fontes, mas vou referenciar alguma, ok!
Parece que o hibernate/suspend é uma briga para vários usuários.
Aqui o hibernate é uma brisa.
Só como observação meu swap tem quase o dobro do tamanho da RAM e nunca deu problema.
RAM 750MiB  Swap 1,3 GiB (Monitor do sistema)
Abraço,
boladegude.

Become an Ubuntu user. Don't just use it as a virtual machine.
If you have some space in your HD then dual boot it with Windows or Mac.
It's a fine system. You shall be willing to study a little, but is worth your effort.

vampire_thunder

Então é por isso que aqui não funciona. Eu tenho 4GB de RAM e só 1GB de swap.

Tota

Citação de: vampire_thunder online 30 de Maio de 2011, 00:54
Então é por isso que aqui não funciona. Eu tenho 4GB de RAM e só 1GB de swap.

Ola

Não é só por isto, mas pode ser também por isto. Só testando.

[]'s

boladegude

Olá,

Havia uma incorreção no script in_out_suspend no item 1) no post inicial do tópico.
Se era dado um pkill num processo que não estava rodando, ocorria um erro em pkill, e a hibernação era interrompida.
Corrija o script in_out_suspend, conforme indicado no post inicial, no item 1), para que seja dado pkill somente nos processos que estão rodando.

Abraço,
boladegude.
Become an Ubuntu user. Don't just use it as a virtual machine.
If you have some space in your HD then dual boot it with Windows or Mac.
It's a fine system. You shall be willing to study a little, but is worth your effort.

boladegude

[Bug]

Quando fui instalar os scripts do post inicial deste tópico em outra máquina, o script in_out_suspend do item 1) não funcionou na parte do "thaw|resume)".
Note que, de qualquer forma, a parte "thaw|resume)" não é utilizada neste tópico.
A correção está aqui apenas para fins de consistência.

Foi necessário fazer o seguinte para que os scripts funcionassem aqui na nova máquina na parte "thaw|resume)" também...

1)
Apague o script do item 1) do post inicial...
sudo rm /etc/pm/sleep.d/in_out_suspend
...desmembraremos ele em dois outros...

2)
Crie o primeiro script.
As instruções de como criar estão no início do script.

------ inicio script 5_in_suspend

#!/bin/bash

# sudo su
# cd /etc/pm/sleep.d
# gedit 5_in_suspend &
# e coloque isto... (depois salve e execute chmod 755 5_in_suspend)
# substitua as ocorrencias de username por seu nome do diretório home

. /usr/lib/pm-utils/functions

case "$1" in
    hibernate|suspend)
   # crie o arquivo /home/user/.Xauthority
   export DISPLAY=:0.0
        export XAUTHORITY=/home/username/.Xauthority

        # assim, roda aplicativo como usuário home
        #sudo LANG=pt_BR.utf8 LANGUAGE=pt_BR:pt:en -u username -i aplicativo


        # editado 20150630: foi substituído pkill por killall,
        # pois pkill tem um limite de 15 caracteres.

        # obs.: somente se o processo está rodando, dá um pkill no mesmo.
        processes="utorrent.exe skype"

        for i in $processes; do
          if ps -C $i >&- 2>&-
          then
            killall -TERM $i
          fi
        done
    ;;
    *)
    ;;
esac

exit

------ fim script 5_in_suspend

3)
Crie o segundo script.
As instruções de como criar estão no início do script.

------ inicio script 15_out_suspend

#!/bin/bash

# sudo su
# cd /etc/pm/sleep.d
# gedit 15_out_suspend &
# e coloque isto... (depois salve e execute chmod 755 15_out_suspend)
# substitua as ocorrencias de username por seu nome do diretório home

. /usr/lib/pm-utils/functions

case "$1" in
   thaw|resume)
        # (roda ao voltar de suspend)
        # crie o arquivo /home/username/.Xauthority
        export DISPLAY=:0.0
        export XAUTHORITY=/home/username/.Xauthority

        # assim, roda aplicativo como usuário home
        #sudo LANG=pt_BR.utf8 LANGUAGE=pt_BR:pt:en -u username -i aplicativo
        # Para a finalidade do presente tópico o thaw|resume não foi utilizado
    ;;
    *)
    ;;
esac

exit


------ fim script 15_out_suspend

4)
Explicação...
Na pasta /etc/pm/sleep.d existem dois scripts do sistema com numeração "10_" no início. Parece que a ordem de ocorrência de "suspend" e "resume" devem ocorrer em sequência e levando em consideração esses scripts.
O script começando com "5_" será o primeiro a ser executado.
O script começando com "15_" será o último a ser executado.

Abraço,
boladegude.
Become an Ubuntu user. Don't just use it as a virtual machine.
If you have some space in your HD then dual boot it with Windows or Mac.
It's a fine system. You shall be willing to study a little, but is worth your effort.