Processos, parte 2: Iniciando (launching) e matando (killing) processos

parte 1: Introdução
parte 2: Iniciando (launching) e matando (killing) processos
parte 3: Capturando saídas com Backtick, ` (crase)
parte 4: calculadora/comando bc
parte 5: Códigos de retorno (return codes)


- Iniciando processos

Não é somente rodar o processo.
Há várias formas de como rodar o processo, como por exemplo, em background, foreground, em um subshell, invoncando 'exec' (não retorna para seu script) ou em'fork' (criando processos filho).

- foreground
Para rodar em foreground, ou primeiro plano, não tem segredo. Basta rodar o comando normalmente, como sempre fez. Aqui é só nomenclatura, só pra você saber que o nome disso é foreground ;)

- background
Você roda em primeiro plano, porque também pode rodar em segundo (background).
Para rodar em background, usar o caractere ampersand '&', também conhecido como 'e comercial' ou sinal tironiano, ao final de seu comando, como você já deve ter percebido no scipt inicial desse artigo.
O uso do & não funcionará bem, porém, se você usar com comandos que enviam a saída para a stdout (redirecione), em comandos que precisem de entrada fornecida pelo stdin (redirecione) ou caso seus scripts interajam com o comando.

- subshell
Um subshell é uma espécie de 'filho' ou instância do shell 'atual'. Você pode usar para rodar um processo em paralelo, por exemplo, ao passo que faz um processo no shell principal e usar o resultado de um no outro.
Quando rodamos um script, por exemplo, ele é executado em um subshell.

Para rodar um comando em um subshell, simplesmente envolva tal comando entre parêntesis:
echo "Atual: $BASH_SUBSHELL" ; (echo "Subshell: $BASH_SUBSHELL")

- exec
Caso não queira um comando em um subshell, use o comando 'exec' antes dos outros comandos, que ele irá forçar o comando a ser rodado na instância atual do shell. Exemplo:
exec echo "Alguém me lê?"

Porém, o 'exec' é mais útil na forma de script. Crie o script exec:
----------
exec echo "Olá, agora você me lê"
echo "Segredo: as vezes ainda uso Windows, mas tenho vergonha de dizer"
----------
Executando:
sh exec

Nota-se que somente o primeiro 'echo' é exibido (ufa!).

Tenha sempre em mente que, com o exec, a coisa vai, mas não volta. Ele substitui o antigo processo pelo novo, ou seja, seu script termina. Cuidado para não perder suas informações. Sempre que usar, certifique-se de que não precisará mais de nada do script.
Ele é particularmente útil para liberar recursos do seu script, como memória, sendo usado em scripts mais longos, perto do fim destes.



- Killing (matando um processo)

Podemos parar a execução de um processo que desejarmos (geralmente por ter travado, por não ter sido finalizado de maneira correta ou ainda estar rodando por algum motivo obscuro), chamamos carinhosamente isso de kill.

Na verdade, o comando não mata nada. Ele simplesmente envia um sinal para o processo, que decide se termina normalmente ou comete 'suicídio' (a maioria dos comandos são programados para se matarem ao receberem um sinal).

Para finalizarmos um processo, usamos o comando 'kill' e a ID do processo. Usamos a opção '-9' pra enviar o SIGKILL.
Por exemplo, vi que a PID do player Clementine é 30271. Para fechá-lo:
kill -9 30271

Obviamente, se estiver tocando Rush no seu player, você irá fechar outro aplicativo.
No que, caso não seja root, você precisa ter sido a pessoa a ter rodado aquele programa.

Caso 'exit' não seja o suficiente para sua sede de Unix: kill -9 $$

Os comandos para matar algum processo são vários e nem todos enviam sinais.
Como o objetivo desse artigo é somente apresentar as ferramentas e informções existentes à respeito dos  processos, não irei entrar em detalhes.
Caso precise saber mais:
man kill
(but woman, more)


Nenhum comentário:

Veja também: