Abrir e usar terminal a partir de outro terminal

Iniciado por brunopio, 06 de Junho de 2011, 11:32

tópico anterior - próximo tópico

brunopio

Parece meio confuso? Vou tentar explicar:
Escrevi um script pra pingar um site (ex.: google) de 1 em 1 minuto, e se falhar, reinicia.
Neste script, quero abrir um outro terminal que abra um programa em python, somente uma única vez, e se falhar, reinicia.
Mas porquê? Se no meu script usar apenas 1 terminal e abrir o programa em python, não consigo fazer com que o ping continue de 1 em 1 minuto. Usando 2 terminais, pelo menos manualmente, eu sei que dá pra rodar o ping e o programa python ao mesmo tempo.
Será que tem como fazer?

druidaobelix

#1
Olá brunopio,


Vê se é isso que v. quer:

Abra um shell normal em Ctrl+Atl+T, que é onde vai replicar, e deixe de lado;

Agora abre um terminal dentro do terminal

Torne ativo o desktop e tecle Alt+F2

Na caixa digite gnome-terminal e tecle Enter

write nome_de_usuario

Você vai obter nesse terminal:

write: user is logged in more than once; writing to pts/0

Naquele primeiro que foi aberto estará (claro que com o seu nome de usuário):

Message from user@hal9000 on pts/1 at 12:08 ...

O que você digitar naquele terminal do write aparecerá no outro terminal.

Talvez seja mais ou menos isso que v. quer.

Se v. é um scripter, talvez fosse mais adequado estar postando na seção "Programação e Scripts", onde teria audiência mais qualificada as suas necessidades, e não em Iniciantes, já que este, por definição, é o "lugar para dar seus primeiros passos", e certamente dar os primeiros passos não é aprender a fazer script. :-)

[]'s

Editando:
Para maiores detalhes, não deixe de ver:

man write
www.arredondar.org.br
Vencedor Desafio de Impacto Social Google 2016!
Você também pode participar e fazer a diferença.

platao

\\\\\\\\Apostilas Dicas e Guias do Ubuntu\\\\\\\\\> http://ubuntuforum-br.org/index.php/topic,79368.msg440997.html#msg440997

brunopio

Obrigado druidaobelix! E desculpe-me, realmente "Programação e Scripts" é o melhor lugar.
Mas eu estava pensando em algo do tipo "meuscript.sh":

#!/bin/sh
funcaoping ()
{
echo "ping google:"
ping -c 1 -w 10 www.google.com
if [ $? -eq 0 ]
then
echo "ping ok."
else
reboot
fi
sleep 2
}
echo "Começando..."
gnome-terminal --command cd pasta1; python teste.py
while true
do
funcaoping
done


E ao rodar, recebo o erro: "Houve um erro ao criar um processo filho para este terminal. Falha ao executar processo filho "cd" (Arquivo ou diretório não encontrado)"
:'(

irtigor

É só colocar um sinal tironiano (&) no final da linha, com isso o bash vai rodar aquele comando em um subshell

#!/usr/bin/env bash

#Procure usar o caminho absoluto mesmo com o programa no path
python caminho/absoluto/ate/o/script.py &

brunopio

Citação de: irtigor online 06 de Junho de 2011, 13:15
É só colocar um sinal tironiano (&) no final da linha, com isso o bash vai rodar aquele comando em um subshell

#!/usr/bin/env bash

#Procure usar o caminho absoluto mesmo com o programa no path
python caminho/absoluto/ate/o/script.py &


Mesmo com as alterações, ainda não roda...

#!/usr/bin/env bash
funcaoping ()
{
echo "ping google:"
ping -c 1 -w 10 www.google.com
if [ $? -eq 0 ]
then
echo "ping ok."
else
reboot
fi
sleep 2
}
echo "Começando..."
gnome-terminal --command python home/eu/pasta1/teste.py &
while true
do
funcaoping
done


Agora abre somente o console do python, mas não roda teste.py de forma automática:
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

:'(

irtigor

Você precisa de um emulador ativo (ou seja, você precisa ver ou digitar alguma coisa)? Porque, se não sabe e/ou não compreendeu o exemplo, você pode rodar o python, ou qualquer outro programa, em um subshell diretamente.
Citação de: brunopio online 06 de Junho de 2011, 13:46
Agora abre somente o console do python, mas não roda teste.py de forma automática:
O -e/--command aceita somente um argumento.
Tente delimitar

gnome-terminal -e 'python home/eu/pasta1/teste.py' &


Se ele não aceitar, adicione o shebang no script python pra poder executa-lo diretamente.

brunopio

Citação de: irtigor online 06 de Junho de 2011, 18:27
Você precisa de um emulador ativo (ou seja, você precisa ver ou digitar alguma coisa)? Porque, se não sabe e/ou não compreendeu o exemplo, você pode rodar o python, ou qualquer outro programa, em um subshell diretamente.
Citação de: brunopio online 06 de Junho de 2011, 13:46
Agora abre somente o console do python, mas não roda teste.py de forma automática:
O -e/--command aceita somente um argumento.
Tente delimitar

gnome-terminal -e 'python home/eu/pasta1/teste.py' &


Se ele não aceitar, adicione o shebang no script python pra poder executa-lo diretamente.

Pois é, eu não preciso ver e muito menos preciso digitar algo.
Mas quando eu testei:

gnome-terminal -e python 'home/eu/pasta1/teste.py' &

Deu na mesma... abre somente o console do python, mas não roda teste.py de forma automática, tenho que digitar o teste.py. Adicionar o shebang no script python deu na mesma também... quando eu fui testar o reboot, também deu erro, dizendo que precisa de autorização (mesmo com chmod +x meuscript.sh)...
o.0
Só um detalhe: sou totalmente noob em script (este é meu primeiro script)!
=)
Mas pelo visto, o que eu quero fazer não deve poder ser feito...
=(

#!/usr/bin/env bash
funcaoping ()
{
echo "ping google:"
ping -c 1 -w 10 www.google.com
if [ $? -eq 0 ]
then
echo "ping ok."
else
reboot
fi
sleep 2
}
echo "Começando..."
gnome-terminal -e python 'home/eu/pasta1/teste.py' &
while true
do
funcaoping
done

irtigor

Citação de: brunopio online 06 de Junho de 2011, 22:40
Só um detalhe: sou totalmente noob em script (este é meu primeiro script)!

Ah... deu pra perceber, você não intendeu metade do que falei...
Novamente, se não precisa interagir, pra quê chamar o emulador gnome-terminal?! Segue a sugestão da minha primeira mensagem.

Citação de: brunopio online 06 de Junho de 2011, 22:40
Mas pelo visto, o que eu quero fazer não deve poder ser feito...

Pode, é só seguir as recomendações (nada de colocar ou trocar o local das coisas).

brunopio

Então...

#!/usr/bin/env bash
funcaoping ()
{
echo "ping google:"
ping -c 1 -w 10 www.google.com
if [ $? -eq 0 ]
then
echo "ping ok."
else
reboot
fi
sleep 2
}
echo "Começando..."
python 'home/eu/pasta1/teste.py' &
while true
do
funcaoping
done


Parece funcionar dentro de usr/local/bin! Mas o teste.py usa pyopencl. Quando usando o script, o teste.py não reconhece pyopencl, mas manualmente no terminal reconhece. Falta alguma coisa pra fazer?

irtigor

O problema está no seu programa. Pegue as mensagens de erro, depois do script e antes do sinal tironiano coloque &> /tmp/script.log

#!/usr/bin/env bash

#Procure usar o caminho absoluto mesmo com o programa no path
python caminho/absoluto/ate/o/script.py &> /tmp/script.log &


Ai você executa e olha o que aparece no arquivo.