Ainda falando sobre processos, é importante saber que podemos controlar as tarefas que são executadas no shell. Esse controle, nada mais é do que suspender a execução de um processo e continuar a executá-lo depois.
Nesse post, vou falar sobre planos de execução de processos e prioridades.
Planos de execução
Planos de execução, são os modos em que um processo pode ser executado: em background ou foreground. Na sua vida de administrador de sistemas, você irá ouvir muito sobre isso!
No post que falei sobre processos, coloquei as definições de background e foreground (vou reaproveitar para usar aqui…):
✔ Background – processos em background estão rodando em segundo plano, ou seja, não tem interação com o usuário, não exibem a execução no monitor e não prendem o terminal (permitem que o usuário inicialize outros processos).
✔ Foreground – processos em foreground estão rodando em primeiro plano, ou seja, o comando é executado e prende o terminal. Nada poderá ser feito no terminal até que o processo termine.
Imagine que você está na empresa e precisa copiar um diretório que tem arquivos grandes. Como isso vai levar um certo tempo e você não quer o terminal preso, pode colocar o comando para rodar em background.
Por exemplo:
# cp -R /dumps /backup &
E o comando para colocar em background é apenas o ‘&‘ no final do comando.
Outro exemplo; podemos atualizar a base de dados do comando locate com um simples updatedb. Mas, dependendo de quanto tempo faz que você não executa esse comando, isso pode levar um tempo; daí, é interessante deixar esse comando rodando em background:
# updatedb &
Quando o shell inicializa um processo em background, nós temos uma linha similar a esta:
# updatedb &
[1] 2984
Essa linha, indica o número do job (entre colchetes) e o número do PID do processo. E para visualizar os processos que estão rodando em backgrond, utilizamos o comando jobs:
# jobs
Agora… vamos ver um outro exemplo. Imagine a seguinte situação: você iniciou o VI em background e precisa traze-lo para foreground (primeiro plano), fazer alguns ajustes e depois voltar o para background novamente.
Xi… confuso, né? Vamos por partes, como faria Jack:
1) Iniciar o processo em background:
# vi &
[1] 2020
Bem, iniciamos o processo em background! Temos o número do job [1]e o PID do processo 2020. Dessa forma, o terminal fica livre! Agora, vamos para o próximo passo, que é trazer o processo para o primeiro plano!
2) Trazer o processo para foreground. Aqui, temos que ter o número do jobs… Se não lembrar o número, executa o comando jobs:
# jobs
[1]+ Stopped vi
Temos o número do jobs! O status do processo é Stopped porque o vi é um processo interativo… não vai fazer nada se estiver em background 😉 !
Vamos trazer o processo para foreground; para isso utilizamos o comando fg:
# fg 1
Com isso, o VI irá abrir, e você poderá fazer os ajustes no arquivo.
3) Feito os ajustes no arquivo, é hora de colocar o processo para rodar em background novamente. Mas ai vem a pergunta: “Como colocar o processo em background sem parar o processo?”
Para isso, temos que primeiro colocar o processo para dormir com o comando CTRL+Z, que é o equivalente ao sinal SIGSTOP (-19); como estamos com o VI aberto; basta teclar CTRL+Z:
^Z
E ai, receberemos uma linha como abaixo:
[1]+ Stopped vi
4) Com o processo parado, podemos colocá-lo para rodar em background novamente; mas agora, não vamos usar o ‘&’ pois este só serve para iniciar um processo em background…
O comando que coloca em background um processo já iniciado é o bg:
# bg 1
[1]+ vi &
Pronto! Já temos o VI rodando em background novamente!
Para encerrar o processo, basta trazer o VI para foreground novamente e teclar ESC+ :q para sair!
Ahn, só lembrando, os comandos jobs, fg e bg são comandos internos do shell! Então, para saber mais sobre eles, basta fazer:
# man bash
Prioridade de processos
A prioridade de um processo, seria a gentileza (nice) que o kernel terá com um processo, reservando tempo de CPU e memória, sendo que, por padrão, cada processo iniciado possui uma prioridade.
Quando configuramos uma prioridade, estamos falando para o kernel tratar determinado processo com gentileza (prioridade alta) ou simplesmente nem tanta gentileza assim (prioridade baixa).
A prioridade padrão de um processo é 10 (equivale a 0 (zero)); e os comandos que utilizamos para controlar a prioridade são o nice e renice.
O comando nice é utilizado quando vamos iniciar um processo com uma determinada prioridade.
Já o comando renice, é usado quando vamos mudar a prioridade de um processo que já está rodando.
Números negativos, indicam alta prioridade, enquanto números positivos indicam prioridade baixa.
Vejam:
No exemplo, vamos iniciar um processo com prioridade alta:
# nice -n -15 find / -iname share
No comando acima, estamos pedindo para localizar arquivos ou diretórios com a palavra share, com prioridade -15.
A opção -n é utilizada pelo comando nice para ajustar a prioridade!
Para ver a prioridade, podemos ir em outro terminal e digitar:
# ps -lax
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 2146 2093 4 -15 2832 756 sync_b D<+ pts/0 0:02 find / -iname share
Onde a opção -l do comando ps é para listar em formato longo, ou seja, todas as informações; o comando, conforme colocado acima, não utiliza a opção u (a opção de listar os processos dos usuários).
E a gentileza que pedimos para o kernel tratar do processo, está na coluna NI.
Agora, para mudar a prioridade de um processo que está em execução, temos que ter o PID do processo. Por exemplo, vamos alterar a prioridade do processo cron:
# pgrep cron
2243
Com o PID em mãos, vamos alterar a prioridade do processo:
# renice -5 -p 2243
2243: old priority 0, new priority -5
Acima, ele mostra o processo, a prioridade antiga, 0, que é a prioridade padrão, e a nova prioridade que definimos!
É isso ai, pessoas… espero que esse post seja útil e ate a próxima! 🙂