A cota usual do sistema de arquivos no ext4 é por usuário / grupo, não por diretório. O ZFS pode definir uma cota de diretório, criando um sistema de arquivos de tamanho fixo em um volume ZFS. Um truque simples, porém, é criar um arquivo de 2 GB, criar um sistema de arquivos e montá-lo na pasta desejada:
$ touch 2gbpasta
$ truncate -s 2G 2gbpasta
$ mke2fs -t ext4 -F 2gpasta
mke2fs 1.43.3 (04-Sep-2016)
Discarding device blocks: done
Creating filesystem with 524288 4k blocks and 131072 inodes
Filesystem UUID: bf1b2ee8-a7df-4a57-9d05-a8b60323e2bf
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
$ sudo mount 2gbpasta pastacota
$ df -h up
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 2.0G 6.0M 1.8G 1% /home/user/pastacota
De qualquer forma, as cotas do sistema de arquivos (ou métodos como este) não são tão amigáveis quanto você deseja. Esse método é flexível unidirecional, pois você pode aumentar o tamanho on-line, mas diminuí-lo seria difícil. Explicando os comandos:
touch: touch 2gbpasta cria um arquivo vazio chamado 2gbpasta.
truncate: truncateé usado para redimensionar arquivos (nesse caso, redimensiono o arquivo 2gbpasta atualmente vazio para 2 GB usando -s 2G).
mke2fs: mke2fs cria sistema de arquivos ext2/3/4 (neste caso, ext4).
mount monta o sistema de arquivos no diretório especificado.
df serve para listar os sistemas de arquivos usados.
O GitLab compete com várias outras plataformas de
gerenciamento de código para equipes de desenvolvimento – como o GitHub e
Atlassian – mas atraiu investidores devido à sua torção open source no
repositório de código e no modelo de ferramenta de colaboração, que
permite aos usuários adaptar a plataforma para melhor atender às suas
necessidades.
O texto acima também quer dizer que você pode baixar a ferramenta e
instalar na sua empresa tendo uma espécie de GitHub lá dentro, mas sua
instalação não será abordada aqui porque depende de várias dependências
online e que do meu ponto de vista podem variar, portanto para ter
acesso ao passo da instalação do GitLab localmente aconselho procurar no
próprio site do GitLab (lembrando que instalei no Linux Debian 8).
Definições para o arquivo de configuração
Para a nossa configuração junto ao Active Directory vamos supor que tenhamos um servidor com as seguintes informações:
Nome do servidor do AD: meu_servidor_do_ad
Nome do domínio: dominio.central
Local onde está localizado o usuário administrador do AD: CN=Users
Base onde estão os usuários do AD: OU=PESSOAS,OU=USUARIOS,OU=ATIVOS,DC=dominio,DC=central.
Meu usuário admin do AD: Jair Rodrigues.
Vale lembrar uma observação feita por um usuário no site do Viva o Linux
de que você não deve tentar reidentar o código, mas apenas descomentar e
alterar o conteúdo do que está dentro das aspas. Eis a observação feita
por ele:
ATENÇÃO: este arquivo gitlab.rb tem indentação
(yaml), sendo assim não mude os espaços, não use tab, cada linha que
você descomentar, deixe os espaços exatamente como estavam, não tente
deixar mais para esquerda, mais para direita, não mexa na formatação,
apenas apague o “#”, mude os atributos e pronto.
Você tem Problemas para Enviar um alerta por email de um script Bash? Adicione isto ao seu script bash! mail -s 'Assunto do email aqui' teste@email.com << EOF
Este é um alerta automático para informar um erro. EOF Solução A instalação padrão do CentOS normalmente vem com o Postfix já instalado. Como tal, o CentOS é capaz de enviar e-mails sem qualquer configuração adicional. Qualquer email que você enviar virá do endereço user hostname.domain se você não tiver configurado um servidor SMTP. Você também pode precisar colocar o endereço na lista de permissões nas configurações de spam da caixa de correio de destino. Se você apenas precisar enviar manualmente um email a partir de um prompt de shell, tudo o que você precisa fazer é digitar o comando mail com o email de destino:
Agora que você já sabe o fabricante, vamos descobrir o modelo:
cat /proc/cpuinfo | grep ‘model name’ | uniq
Para saber a arquitetura execute o seguinte comando:
lscpu
Agora vamos verificar a frequência, você pode um dos dois comandos abaixo:
lscpu | grep -i mhz
ou
cat /proc/cpuinfo | grep -i mhz | uniq
Nota: Não se assuste se a frequência for menor do que a que consta no site do fabricante, alguns processadores podem apresentar esta variação devido a estarem configurados para economizar energia.
Caso queira ver as variações de frequência você pode executar o comando abaixo:
watch -n 0.1 “cat /proc/cpuinfo | grep -i mhz”
Agora, para saber o número de núcleo do processador, execute o comando abaixo:
lscpu
Para saber a quantidade de memória digite o comando:
Aqui está um pequeno script que me ajudou a copiar arquivos que foram modificados nos últimos 60 minutos para um novo diretório. O script usa uma combinação dos comandos find e cp, ele deve ser executado dentro do diretório que contém os novos arquivos. Neste exemplo, vou copiar todos os arquivos que foram modificados nos últimos 60 minutos de / var / www para o diretório / var / newfiles, você pode substituir o intervalo de tempo ou o diretório de destino no script para corresponder aos requisitos do seu reqzuirements.
Primeiro, entre no diretório /var/www que contém os arquivos:
cd / var / www
Então execute este comando para encontrar os arquivos mais recentes e copie-os para /var/newfiles:
find ./ -tipo f -mmin -60 -exec cp -pf {} / var / newfiles / \\;
Utilizando rsync para backup de dados automático entre servidores
Precisei sincronizar algumas pastas do nosso servidor principal para um servidor secundário. Utilizamos dois servidores Ubuntu 8.04. A solução veio com o Rsync, que já vem instalado por padrão nesta distribuição.
No computador destino criei a pasta /home/tiago/sincronizacao-servidor.
Lendo o man do rsync cheguei a conclusão que, para o meu caso, alguns parâmetros serão úteis: v - verbose -r, --recursive recurse into directories -u, --update skip files that are newer on the receiver -h, --human-readable output numbers in a human-readable format -i, --itemize-changes output a change-summary for all updates -P same as --partial --progress -t Preserva a data original do arquivo --delete-excluded
Digamos que você possua um script para realizar um procedimento em um determinado intervalo de tempo. Seja para o backup de arquivos mais obsoletos em projetos que você realizou há algum tempo e, por algum motivo, não optou pelo seu versionamento ou um simples backup de um banco de dados.
No que se refere a backups, existem duas formas para transitar estes dados:
Entre ambientes locais.
De um ambiente local para um remoto (e vice-versa).
Além disso, podemos utilizar os comandos scp, rsync ou cp para realizar a transferência destes arquivos.
Lembre-se de armazenar os seus arquivos em um local seguro no momento do backup.
ENTENDENDO O CRONTAB
O formato para o crontab é o seguinte: Campo Função Valores
1 Minuto 0-59
2 Hora 0-23
3 Dia do mês 1-31
4 Mês 1-12
5 Dia da semana 0-6
6 Programa para execução comando ou script
O dia da semana começa a contar no domingo (0).
Confira abaixo como podemos criar as nossas tarefas:
# Cada linha representa uma tarefa no crontab
00 6 * * 1 /caminho/para/script/status.sh
00 12 5 * * /caminho/para/script/temp.sh
30 23 * * * /caminho/para/script/backup.sh
Perceba que, estamos programando a execução de 3 scripts em Shell nas datas selecionadas e os mesmos farão o seguinte:
status.sh: realizar o procedimento contido neste script toda segunda, às 6:00 da manhã.
temp.sh: realizar o procedimento contido neste script no dia 5 de cada mês, às 12:00.
backup.sh: realizar o procedimento contido neste script todos os dias, às 23:30 da noite.
Você ainda pode adicionar um 7 (sétimo) campo, onde o sexto campo será substituído pelo nome do usuário no sistema e o sétimo campo adicionado com o programa a ser executado. Veja o exemplo a seguir:
# Execute esta tarefa a cada três horas, no dia 1 (um) de cada mês com o usuário root.
00 */3 1 * * root /caminho/para/script/security.sh
Perceba que estamos utilizando um novo método para definir o período desta tarefa, o */3. Este trecho faz com que a tarefa seja executa em intervalos de 3 horas. Você poderia ainda definir os horários que esta tarefa seria executada, utilizando uma , (vírgula) para cada horário. Por exemplo: 00 3,9,15,21 1 * * root /caminho/para/script/security.sh.
IMPORTANTE
Os scripts a serem executados no exemplo acima pelo crontab, precisam estar definidos como executáveis no seu Shell. Para isso, certifique-se de que o comando chmod +x /caminho/para/script/seuscript.sh foi executado previamente. Do contrário, utilize o operador &¶ compactar uma instrução no momento da execução do script. Como faremos isso?
Usar bash ou sh para executar o seu script, vai depender do seu Shell.
Não esqueça que para tornar um script executável, é preciso definir um shebang.
[][15]GERENCIANDO SUAS TAREFAS PROGRAMADAS
Utilize o seguintes comandos para gerir as suas tarefas no crontab:
crontab -e: editar o arquivo atual ou criar um, caso não exista
crontab -l: listar suas tarefas programadas
crontab -r: remover uma tarefa programada
Nota: algumas empresas de hospedagem, disponibilizam o serviço para Crontab. Entre em contato com o atendimento da empresa para saber se este serviço está disponível para você.
INDO ALÉM
Existem algumas maneiras para facilitar ainda mais o uso do crontab.
PALAVRAS ESPECIAIS
O crontab fornece alguns atalhos para definirmos nossas tarefas, veja abaixo: Atalho Significado
@reboot Será executado na inicialização do sistema.
@yearly Será executado uma vez ao ano, "0 0 1 1 *".
@annually O mesmo que @yearly
@monthly Será executado a cada mês, "0 0 1 * *".
@weekly Será executado uma vez por semana, "0 0 * * 0".
@daily Será executado uma vez por dia, "0 0 * * *".
@midnight O mesmo que @daily
@hourly Será executado a cada hora, "0 * * * *".
Importante: sempre aponte para os arquivos utilizando caminhos absolutos, pois o crontab não lê as variáveis de ambiente do Shell.
CARREGAR SUAS TAREFAS EM UM ÚNICO ARQUIVO
Você pode definir todas as suas tarefas em um único arquivo e chamá-lo com o crontab. Veja o exemplo abaixo:
# 1. Crie o arquivo jobs.txt com o conteúdo abaixo:
00 6 * * 1 [comando ou script para executar]
00 12 5 * * [comando ou script para executar]
30 23 * * * [comando ou script para executar]
# 2. Execute o comando: crontab jobs.txt
Nota:
O processo vai substituir qualquer tarefa anterior com o conteúdo que estiver neste arquivo, sem qualquer aviso.
Fica a seu critério como nomear e categorizar as suas tarefas.
Hoje estou enviando alguns conceitos “aulas” de shell, mas que podem fazer uma boa diferença para quem está aprendendo.
Shell
O shell é um interpretador de comandos. Sempre que digitamos algo ele interpreta o nos dá algum retorno. Podemos escrever sequências de comandos que serão executados pelo shell. Essa sequência de comandos fica guardada em um arquivo e é chamada de ‘script’. Como esse script será interpretado por um shell, ele é chamado de Shell Script.
Sabores de Shell
Existem vários interpretadores Shell no mundo Unix, os mais conhecidos são:
Bourne Shell (sh): Desenvolvido por Stephen Bourne no Bell Labs (da AT&T) foi o shell padrão dos sistemas Unix por muitos anos. Hoje está presente em diversos sabores de Unix e em praticamente todas as distros GNU/Linux.
Korn Shell (ksh): Desenvolvido por David Korn, também no Bell Labs, é um uma extensão do sh com várias melhorias. Por ter funções que o sh não tem, acaba sendo a opção de alguns programadores.
Bourne Again Shell (bash): Este é o shell oficial do projeto GNU. Tem suporte total ao sh e acrescenta novos comandos. É o shell que mais cresce em número de usuários e é o padrão das distros GNU/Linux.
Existem diversos sabores de shell, mas coloquei aqui apenas os principais. No restante deste documento usarei apenas o bash, mas a palavra ‘shell’ poderá ser usada para referencia-lo.
Como funciona um comando
Quando se digita um comando em shell, ele é interpretado e executado. Em shell existem os comandos do próprio shell (if, switch) e também os diversos programas/comandos do sistema operacional (ls, cd, mkdir).
Atribuição de Variáveis
Em shell é possível criar variáveis (assim como nas linguagens de programação) para guardar valores. Para isso use a sintaxe:
Um exemplo:
Repare que não há espaços ao redor do símbolo de igual.Para exibir o conteúdo de uma variável e necessário usar um cifrão ($) antes de seu identificador:
Redirecionamento de Saída
Em shell é possível direcionar a saída de um comando para um arquivo usando as instruções ‘>’ e ‘>>’. O comando ‘ls’ lista o conteúdo de um diretório na tela. Para direcionar a saída do comando ls para um arquivo use ‘>’: $ ls > resultado.txt O redirecionador ‘>’ apaga o conteúdo do arquivo e grava a saída do comando. Para adicionar a saída de um comando ao final de um arquivo use ‘>>’, dessa forma o conteúdo do arquivo será mantido:
A primeira linha imprime o texto “Iniciando script” no arquivo log.txt, se o arquivo já existir, ele apaa o conteúdo. A segunda linha lista o conteúdo do diretório /etc, e joga a saída para o arquivo log.txt, dessa vez mantendo o conteúdo do arquivo. A terceira linha imprime o texto “Finalizando script” no arquivo log.txt, mantendo o conteúdo do arquivo.
Redirecionamento entre comandos
Além de redirecionar a saída de um comando para um arquivo, também é possível redirecionar a saída para outro comando usando o pipe (
), barra vertical. O comando ls lista o conteúdo de um diretório, o comando wc conta linhas, palavras e caracteres de um arquivo. Unindo esses dois comandos eu posso saber facilmente a quantidade de arquivos e diretórios dentro de um diretórios:
O ls vai listar cada arquivo em uma linha e o wc, com a opção ‘-l’, vai contar a quantidade de linhas.
Guardando a saída de comandos em variáveis
No exemplo anterior o script contava o número de arquivos e diretórios em um diretório. Para guardar esse número em uma variável é necessário colocar o comando entre acentos graves:
Manipulando Strings
Existem comandos bem interessantes para manipular textos em ambientes Unix. Um deles é o ‘cut’. Este comando ‘corta’ um arquivo em colunas devolvendo apenas a informação requisitada. Veja um exemplo, o arquivo ‘/etc/passwd’ guarda a lista de usuários do sistema e algumas outras informações:
Esta lista tem muita informação, só o que eu quero é o nome dos usuários. Como este arquivo tem campos delimitados por ‘:’, basta usado comando ‘cut’ para cortar o arquivo em colunas:
Pronto, uma lista bem menor, apenas com os nomes dos usuários. No comando ‘cut’ a opção ‘-d’ define o delimitador das colunas do arquivo, no caso ‘:’, e a opção ‘-f’ diz qual é a coluna que queremos, no caso a 1ª.Vamos alterar este comando para que ele retorne apenas os usuários que não possuem um shell no sistema. Esses usuários são identificados por terem um shell ‘/bin/false’ na 7º coluna do arquivo ‘/etc/passwd’. Para pegar esses usuários podemos usar o comando ‘grep’ que filtra um texto e imprime apenas as linhas que contém o texto pesquisado:
Legal, consegui a lista de usuários, mas eu queria apenas os nomes… Então basta redirecionar a saída mais uma vez e usar o ‘cut’:
Para inverter a pesquisa e mostrar apenas o usuários que tem sim algum tipo de shell, diferente de /bin/false, basta usar a opção ‘-v’ do ‘grep’ para que ele inverta a pesquisa e mostre não as linhas que NÃO casam com o texto informado:
E para exibir a quantidade de usuários com algum tipo de shell basta usar o comando ‘wc’:
Criando Scripts
Até agora os comandos foram executados no prompt do bash. Desta vez vou criar um arquivo com uma sequência de comandos que serão executados. veja o conteúdo do arquivo:
Salvei este arquivo com o nome ‘usuarios_shell.sh’. A extensão ‘.sh’ não é obrigatória, mas facilita na hora de procurar seus scripts. Além disso alguns editores de texto (gedit) usam essa extensão para deixar o arquivo com sintaxe colorida, o que facilita bastante a edição.Para executar o arquivo use o comando ‘bash usuarios_shell.sh’, dessa forma o arquivo será interpretado e executado pelo ‘bash’.No arquivo há ums instrução especial na primeira linha. Essa instrução diz que esse arquivo deve ser interpretado pelo bash e graças a ela podemos executar esse script sem usar o comando ‘bash nome_do_arquivo.sh’. Para isso é necessário que o arquivo tenha permissão de execução:
Agora basta executar o arquivo:
O ‘./’ é o caminho atual do arquivo (diretório atual) e é necessário para que o bash saiba onde está o arquivo que se pretende executar caso ele não esteja em um diretório que faz parte da $PATH, que é uma veriável que contém os diretórios onde há programas para serem executados.
Considerações
Graças ao poder dos redirecionadores, como o pipe (|), é possível montar scripts aos poucos, unindo as funcionalidades de diversos comandos. No exemplo acima foram usados os comandos ‘cat’, ‘grep’, ‘cut’ e ‘wc’ para gerar apenas um resultado. Essa é a maneira shell script de se construir scripts, unindo pequenos pedaços, que sozinhos fazem pouco, mas juntos fazem muito.
Shell Script - Parte 2 - Controle de Fluxo
Tomada de Decisões
Em toda linguagem de programação existe alguma estrutura para tomada de decisões. Essa estrutura em geral é feita através do comando “if”. O comando “if” analisa de uma expressão é verdadeira e então executa um bloco de código, caso a expressão seja falsa pode ser executado, ou não, um outro bloco.
Em geral as linguagens de programação oferecem maneiras de verificar se um valor é igual, menor ou maior que outro. As formas mais comuns são:
==: Igual à
!= : Diferente de
< : Menor que
> : Maior que
<= : Menor ou igual à
>= : Maior ou igual à
Em shell script os mesmos testes são obtidos com:
-eq : (equal) Igual à
-ne : (not equal) Diferente de
-lt : (less than) Menor que
-gt : (greater than) Maior que
-le : (less or egual) Menor ou igual à
-ge : (greater or equal) Maior ou igual à
O uso do “if” em shell script é assim:
Repare que é necessário manter espaços entre os colchetes e os números, ou variáveis. O bloco após a palavra “then” será executado se a expressão dentro do “if” for verdadeira. O bloco “if” termina com a palavra “fi” que é “if” ao contrário. Essa é uma maneira simples de identificar o final de um “if” quando o encontramos.
As expressões acima são mais comuns para tratar números. Para fazer comparações com textos use:
= : Igual à (isso mesmo apenas um sinal de igual)
!= : Diferente de
-n : String existe e não é vazia (apenas um operador)
**-z **: String existe e é vazia (apenas um operador)
Veja um exemplo com Strings:
No script acima o “if” verifica se a variável $nome existe e está vazia, isso significa que o usuário não digitou o nome dele. A instrução “read” faz com que o shell leia alguma informação via teclado e retorne essa informação para a variável informada.
Também no script acima foi usada a palavra “else” que significa “senão”. Esse bloco é executado quando o “if” retorna um valor falso.
O Super IF do Shell
Mas o shell oferece mais opções para o “if” do que as linguagens de programação o fazem! Veja outras opções bem interessantes:
**-s **: Arquivo existe, não vazio (apenas um operador)
**-f **: Arquivo existe, não é um diretório (apenas um operador)
**-d **: Diretório existe (apenas um operador)
**-w **: Arquivo, com permissão de escrita (apenas um operador)
-r : Arquivo, com permissão de leitura (apenas um operador)
**-x **: Arquivo, com parmissão de execução -x (apenas um operador)
Veja um exemplo:
O script acima verifica se o arquivo “/tmp/meuLog.txt” existe. Caso exista ele continua o arquivo, colocando mais informações no final dele (redirecionador >>). Caso o arquivo não exista ele o inicia (com o redirecionador >).
IFs Aninhados
Chamamos de “ifs aninhados” as construções onde há um “if” dentro do bloco “then” ou “else” de outro “if”:
IF Multilevel
Você pode fazer comparações em sequência, com o uso do “elif”, desse jeito:
Além do comando “if”, o shell oferece opções como “case” para controle de fluxo.
O Comando Case
O comando “case” é usado para executar um bloco de código de acordo com o valor de uma variável. O comando “case” é interessante pois pode definir diversas opções diferentes sem usar uma estrutura com diversos comandos “if”, “elif” e “else”. Veja um exemplo:
O script acima exibe uma mensagem e então pede uma informação do usuário. O usuário vai digitar alguma letra e então o comando “case” entra em ação. Ele verifica qual valor foi digitado pelo usuário e executa os blocos de código relativos a cada opção. Primeira opção é a padrão, por isso ela é executada mesmo que o usuário não digite um valor.Cada bloco do case é iniciado por um valor que a variável analisada pode ter, ou vários valores, separados por um pipe. Os blocos são finalizados por uma sequência de dois caracteres ‘ponto-e-vírgula’ (;;).
Conclusão
A estrutura de controle “if” do shell é bem interessante pois permite fazer diversas comparações entre valores e ainda oferece opções para lidar com o sistema de arquivos. O comando “case” pode tratar diversos valores de uma vez, o que acuda a manter o código mais limpo e organizado.