quarta-feira, 7 de junho de 2017

Tratando CTRL-C em python

Quando pressionamos CTRL-C no teclado e nosso programa está rodando, normalmente isto significa que o programa deverá parar. Quando pressionamos CTRL-C é gerado um sinal para o programa.
Um sinal é uma forma de comunicação entre processos utilizada nos sistemas operacionais compatíveis com POSIX. Um sinal é uma notificação assíncrona enviada para um processo ou para um segmento específico dentro do mesmo processo para notificá-lo de um evento que ocorreu.

Quando um sinal é enviado, o sistema operacional interrompe o fluxo normal de execução do processo alvo para entregar o sinal. A execução pode ser interrompida durante qualquer instrução não atômica. Se o processo já registrou um manipulador de sinal, essa rotina é executada. Caso contrário, o manipulador de sinal padrão é executado.

O python permite que troquemos como os sinais serão tratados, assim dá para capturar o envio do CTRL-C e executar um procedimento de tratamento personalizado. Abaixo a gente pode observar um exemplo de como fazer este tratamento de sinal.
Precisamos importar a biblioteca SIGNAL do Python.
Utilizamos na linha 23 o comando para atribuir uma função de tratamento signal_handler() para o sinal CTRL-C (SIGINT). Nas linhas 11 a 17 criamos o nosso tratador signal_handler().
Note que ele recebe dois parâmetros, o número do sinal (pois a gente pode usar a mesma função para tratar vários sinais) e os dados da pilha.



Você pode obter este módulo em meu repositório python_codes no github.

Referências

Quer saber com mais detalhes como este processo de sinalização ocorre no sistema operacional?
Leia a seção 4.6.2 sobre manipulação de sinais do livro do Silberschatz.
Se quiser ler mais sobre a manipulação de sinais no Pythom, veja em python docs.

sexta-feira, 14 de abril de 2017

Rodando Docker sem sudo

Quando instalamos o docker, o nosso usuário não fica automaticamente habilitado para rodar o docker sem utilização do comando sudo. Isto acontece porque o daemon do docker sempre é executado como o usuário root. Desde docker versão 0.5.2, o daemon docker se liga a um socket Unix em vez de uma porta TCP. Por padrão, esse socket Unix é propriedade da usuário root e, portanto, por padrão, você pode acessá-lo com o sudo. Se você tentar rodar terá o seguinte erro:


A partir da versão 0.5.3, se você criar um grupo Unix chamado docker e adicionar usuários a ele, então o daemon do docker fará com que o grupo tenha acesso de leitura e escrita neste socket Unix quando o daemon for iniciado .

O daemon do docker deve sempre ser executado como o usuário root, mas se você executar o cliente docker como um usuário no grupo do docker, então você não precisa adicionar o sudo a todos os comandos do cliente.

Então como fazer para rodar. Os passos são:

  1. adicionar o grupo docker, caso ele ainda não exista (no meu caso ele já existe)
  2. adicionar o seu usuário (e qualquer outro que você queira) ao grupo do docker
  3. reiniciar o daemon: no meu caso o processo chama docker, mas em algumas versões de SO o nome é docker.io.


Você precisa carregar nas configurações de seu usuário o novo grupo. Você pode: (1) fazer log out e entrar novamente ou (2) usar o comando "newgrp docker" para carregar estas configurações. No meu exemplo abaixo eu usei a segunda opção. Com isto agora meu usuário consegue carregar o hello-world sem utilizar o sudo.


quarta-feira, 1 de março de 2017

Docker e Java

Normalmente eu preciso utilizar o java. Meu sistema operacional preferido é o Ubuntu, mas na Universidade o sistema operacional apesar de ser linux, não é o Ubuntu. A utilização do Docker é ideal neste caso, pois posso utilizar meu ambiente favorito, não necessário um ambiente de virtualização na estação que estou utilizando, bastando ter o docker instalado e meu usuário no grupo docker.

Um jeito de automatizar o processo é utilizar um dockerfile e criar um docker local usando o comando docker build. Se você quiser ter mais informações leia a documentação no site do docker em https://docs.docker.com/engine/reference/builder/.

Vamos então a instalação e criação de um docker com java 9.
São dois passos:

  1. Instale o docker no seu computador
  2. Rode o comando docker build github.com/h3dema/ubuntu_java
Vá tomar um café pois demora um pouco. Será feito o download do programa e seu docker será criado.

Pronto!



PS: Hoje (29/05/2017) este procedimento não está funcionando mais. A Oracle retirou do ar o site java.net que era onde era baixado o JDK. Assim que o pessoal do webupd8 atualizar o script, eu indico aqui também.