() translation by (you can also view the original English article)
Então, por que *NIX e por que precisamos ir ao terminal?
De acordo com estatística do W3Techs, Unix é usado por 68% de todos os sites dos quais eles sabem o sistema operacional. Ou seja, sendo desenvolvedores web, é provável que nosso coódigo esteja rodando um um servidor Linux. É preciso sabermos como configurar ou depurar nosso código em sistemas Linux e Unix. Vejamos o que é preciso para isso.
O Básico
O comando básico *NIX consiste de três componentes:
- commando or programa a executar
- opções para especificar comportamento do comando
- argumentos ou entrada necessária para o comando
Por exemplo, se precisamos obter uma lista de arquivos no diretório /var/www
, precisamos executar o comando ls
com o argumetno /var/www
. Para adicionar o tamanho dos arquivo no retorno, adicionamos a opção -s
, e o comando será assim:
1 |
ls -s /var/www |
Redirecionamento e Condução de Entrada e Saída
Muitos comandos *NIX usam entrada e saída textual que podemos operar, e o legal disso é que podemos enviar os retornos do comando para um arquivo usando redirecionamento ou mesmo enviá-lo para outro comando como entrada, usando conduções. Por exemplo, podemos salvar o retorno do comando do exemplo anterior um arquivo:
1 |
ls -s /var/www > /var/www/files.txt |
O comando criará ou apagará o arquivo /var/www/files.txt
e salvará a lista de arquivos do diretório /var/www
no lugar. Eis uma lista de redirecionamento e condução padrão:
-
>
Redireciona o retorno de um comando para um arquivo. Esse será apagado e sobrescrito. -
>>
Redirecionamento com anexo não apagando. -
<
Obtém entrada de um arquivo para um comando. -
|
Passe o retorno de um comando como entrada para outro. -
tee
Redireciona para um arquivo e passa como entrada para o próximo comando.
Os Principais Comandos
Para ver o manual de um comando, execute man
. Páginas de manual segue um layout comum e podem incluir nome, sinpse, descrição e exemplo de uso. Isso mostrará a documentação do comando chmod
:
1 |
man chmod |
Para executar alguns comandos, como salvar configurações ou reiniciar processos, precisamos executá-los como super usuário. Para isso, precisamos iniciar o comando com sudo
:
1 |
user@server:/var/www$ chmod 777 log |
2 |
chmod: changing permissions of ‘log’: Operation not permitted |
3 |
user@server:/var/www$ sudo chmod 777 log |
4 |
sudo chmod 777 log |
Se precisarmos executar vários comandos como super usuário, podemos usar su
para mudar para o usuário super.
1 |
user@server:/var/www$ su |
2 |
Password: |
3 |
root@server:/var/www# |
Nota: Para manter-se seguro e evitar execução acidental de comandos questionáveis, não use sudo
ou su
sem motivo.
No Mundo Real
Navegação Básica
Existem 3 comandos base para navegar uma árvore de arquivos:
-
pwd
para imprimir o nome do diretório atual -
cd
para mudar de diretório -
ls
para listar o conteúdo
Eis um exemplo do uso desses comandos com seus retornos no terminal:
1 |
user@server:~$ pwd |
2 |
/home/user |
3 |
user@server:~$ cd /var/www |
4 |
user@server:/var/www$ ls -alF |
5 |
total 16 |
6 |
drwxr-xr-x 5 root root 4096 Jan 22 09:45 ./ |
7 |
drwxr-xr-x 14 root root 4096 Jan 22 09:38 ../ |
8 |
drwxr-xr-x 2 root root 4096 Jan 22 09:45 html/ |
9 |
drwxr-xr-x 3 root root 4096 Jan 22 09:45 log/ |
10 |
drwxrwxrwx 1 user user 442 Mar 24 12:22 testing/ |
Buscando Arquivos
Existe o comando find
para buscar arquivos numa hierarquia de diretórios. Esse comando é bem poderoso e pode buscar por arquivos e diretórios por nome, permissões, datas e tamanhos.
Para encontrar todos os diretórios com "logs" no nome no diretório /var/www
usando a opção -type
:
1 |
find /var/www -type d -name logs |
Para buscar por arquivos PHP no diretório atual, adicione a opção -name
:
1 |
find . -type f -name "*.php" |
Para buscar arquivos com determinada permisão, use -perm
:
1 |
find . -type f -perm 0777 -print |
Encontre todos os arquivos maiores que 500MB:
1 |
find / -size +500M |
Claro, podemos combinar todas essas opções em um só comando. Isso é só o basico do comando find
, uma ferramenta poderosa para buscar arquivos. Use as páginas de manual para mais informações.
Manipulando Arquivos e Diretórios
Existem cinco comandos base para manipular arquivos e diretórios em sistemas *NIX:
-
touch
é usado para alterar marcas de data em arquivos existentes e diretório, mas também para criar arquivos -
mkdir
para criar diretórios -
cp
pra copiar arquivos e diretórios -
mv
para mover e renomear arquivos e diretórios -
rm
para apagar arquivos e diretórios
O próximo exemplo criará um arquivo index.html
, copia-lo-á para um novo diretório em /var/www
e removerá o original.
1 |
root@localserver:~# touch index.html |
2 |
root@localserver:~# mkdir /var/www/newdir |
3 |
root@localserver:~# cp index.html /var/www/newdir/ |
4 |
root@localserver:~# rm index.html |
Outro ótimo comando é o ln
, usado para criar elos entre arquivos. O comando ln
é usado, geralmente, para criar elos simbólios para habilitar host virtual:
1 |
sudo ln -s /etc/apache2/sites-available/newvirtualhost.com.conf /etc/apache/sites-enabled/ newvirtualhost.com.conf |
Alterando Permissões de Acesso
Para alterar o dono ou grupo de um arquivo, use chown
. Não esqueça de dar permissões ao usuário apache ao criar uma novo host virtual para sua aplicação web:
1 |
sudo chown -R www-data:www-data /var/www/newvirtualhost.com |
Por vezes, pastas de cache e registros devem ser acessíveis a todos usuários, logo é preciso alterar o modo de acesso para 777 com chmod
. Adicione a opção -R
para adicionar permissão a todos os arquivos e diretórios aninhados.
1 |
sudo chmod -R 777 /var/www/private/cache |
Se quiser apenas tornar um arquivo executável, use chmod
com a opção +x
.
1 |
sudo chmod +x /var/www/private/backup.sh |
Leitura de Arquivos
Para ver arquivos, podemos usar o comando cat
. Com cat
, podemos concatenar o conteúdo de arquivos usando parâmetros extras e também podemos mascarar nomes de arquivo.
1 |
cat /etc/apache2/apache2.conf |
2 |
cat /etc/apache2/apache2.conf /etc/apache2/ports.conf |
3 |
cat /etc/apache2/mods-enabled/* |
Mas o comando cat
confundirá você bem rápido, porque mostrar o retorno bruto sem qualquer paginação—logo, é inconveniente usá-lo com registros. Para filtrar ou paginar um texto uma tela por vez, deveríamos usar os comandos more
ou less
, que são muito melhores.
1 |
less /etc/apache2/apache2.conf |
2 |
cat /etc/apache2/mods-enabled/* | less |
Outro comando útil é o tail
, criado para retornar apenas a parte final dos arquivos. O comando é perfeito para dar uma olhada em registros. Por padrão, ele retornará as últimas 10 linhas, mas pode-se mudar esse número usando a opção -n
.
1 |
tail /var/log/apache2/error.log |
2 |
tail -n 25 /var/log/apache2/error.log |
Mas se tivermos, por exemplo, vários registros, precisamos de algo mais poderoso para uma busca melhor. Algo como grep
—um programa que lê da entrada padrão, testa cada linha contra um padrão e retorna para a saída padrão, as linhas que casaram. Ao usá-lo junto de cat
e condutores, obteremos o que queremos.
Se quisermos filtrar linhas de texto do retorno, podemos usar o comando grep
:
1 |
grep notice /var/log/apache2/error.log |
2 |
cat /var/log/apache2/*.log | grep "shutting down" |
Como podemos ver, grep
é ótimo para condução. Nesse exemplo, o último comando retornará todas as linhas contendo "shutting down" dos registros.
Edição de Arquivos
Se quisermos editar arquivos de texto no terminal, podemos usar um dos três mais populares editores:
- GNU nano, um editor de texto pequeno e amigável que é uma escolher perfeita para tarefas básicas
- Vim, um editor de texto aprimorado para programador, que é o mais poderoso mas complexo para iniciantes.
- mcedit, um editor totalmente completo da Midnight Commander, que é fácil de usar mas não é instalado por padrão em sistemas *NIX
Compares-os e escolha um:
1 |
nano /var/log/apache2/error.log |
2 |
vim /var/log/apache2/error.log |
3 |
mcedit /var/log/apache2/error.log |
Arquivamento
Por vezes, precisamos copiar ou comprimir alguns dados do servidor.
Os utilitários de arquivamento mais comuns são o tar
e o zip
. Note que o comando zip
talvez não esteja instalado no servidor por padrão.
Podemos criar arquivos com os comandos a seguir:
1 |
tar -zcvf archive-name.tar.gz directory-or-file-name |
2 |
tar -jcvf archive-name.tbz2 directory-or-file-name |
3 |
zip archive-name.zip directory-or-file-name |
Se quisermos apenas ver uma lista dos arquivos, podemos usar a opção -l
tanto para tar
quanto unzip
:
1 |
tar -ztvf archive-name.tar.gz |
2 |
tar -jtvf archive-name.tbz2 |
3 |
unzip -l archive-name.zip |
Ou extraia alguns arquivos:
1 |
tar -zxvf archive-name.tar.gz |
2 |
tar -jxvf archive-name.tbz2 |
3 |
zip archive-name.zip |
Tarefas Programadas
Se quiser programar seus scripts para executar periodicamente, é preciso usar o utilitário Cron, conduzido pela tabela cron—um arquivo de configuração de comandos de terminal a serem executados periodicamente em determinado prazo. E o comando para manter as tabelas cron é crontab
.
Executar crontab com a opção -l
exibirá a tabela cron.
Com a opção -u
, especificamos o nome do usuário dono da crontab será usada. Se executarmos tarefas na aplicação web, é melhor editar a crontab do usuário www-data.
1 |
user@server:~$ sudo crontab -lu www-data |
2 |
# m h dom mon dow command
|
3 |
*/5 * * * * php5 /var/www/yii do/tasks >> /var/www/tasks.log |
4 |
00 15 * * 1-5 /var/www/backuper.sh |
Nesse retorno, podemos ver um exemplo de tabela cron. Como vemos, cada linha é programada por minuto, hora, dia do mês, mês e dia da semana. Cada campo pode ser um asterísco, indicando todos os valores do campo. Também se pode usar conjuntos e intervalos, usando vírgulas e hífens. Uma barra após um intervalo cria-se exceções no valor do número naquele intervalo. No exemplo, o primeiro comando executará a cada cinco minutos e o segundo de Segunda a Sexta às 15h.
Para editar a lista, execute crontab com -e
ao invés de -l
. A lista cron será aberta no editor padrão. Use a opção -r
para limpar a lista.
Monitoramento de Performance
O comando top resume a informação do sistema e provê uma visão dinâmica em tempo real dos processos em execução. Aperte Shift-M
para ordenar processos por uso de memória ou Shift-P
por uso de CPU.
1 |
top - 21:33:02 up 308 days, 21:24, 1 user, load average: 0.00, 0.01, 0.05 |
2 |
Tasks: 87 total, 1 running, 86 sleeping, 0 stopped, 0 zombie |
3 |
%Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st |
4 |
KiB Mem: 501800 total, 471348 used, 30452 free, 49672 buffers |
5 |
KiB Swap: 4194300 total, 56192 used, 4138108 free. 149488 cached Mem |
6 |
|
7 |
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND |
8 |
16269 www-data 20 0 348592 38884 12044 S 0.0 7.7 0:02.42 php5 |
9 |
26533 www-data 20 0 409516 38488 24312 S 0.0 7.7 1:00.04 php5-fpm |
10 |
1076 mysql 20 0 887824 32748 1616 S 0.0 6.5 276:46.59 mysqld |
11 |
862 syslog 20 0 256612 31428 368 S 0.0 6.3 32:45.88 rsyslogd |
12 |
18901 root 20 0 105632 4316 3248 S 0.0 0.9 0:00.04 sshd |
13 |
25393 www-data 20 0 87356 4312 1564 S 0.0 0.9 4:46.92 nginx |
14 |
27846 memcache 20 0 328464 3828 252 S 0.0 0.8 1:04.30 memcached |
Para mostrar o tanto de memória livre e usada pelo sistema, use o comando free
. Adicione a opção -h
para retornar os comandos num formato legível.
1 |
user@server:~$ free -h |
2 |
total used free shared buffers cached |
3 |
Mem: 490M 453M 36M 23M 46M 140M |
4 |
-/+ buffers/cache: 265M 224M |
5 |
Swap: 4.0G 54M 3.9G |
Outro comando útil é o df
, que reporta o uso do espaço em disco do sistema. Executamo-no com a opção -a
para mostrar todos os sistemas de arquivos do seu seservidor. Também não esqueça a opção -h
para um formato legível.
1 |
user@server:~$ df -ah |
2 |
Filesystem Size Used Avail Use% Mounted on |
3 |
/dev/vda1 20G 6.3G 13G 34% / |
4 |
udev 235M 4.0K 235M 1% /dev |
5 |
tmpfs 50M 344K 49M 1% /run |
Histórico da Linha de Comando
Podemos usar o comando !!
para repetir o comando anterior, ou usar sudo !!
se esquecemos de executá-lo com sudo
.
1 |
user@server:/var/www$ chmod 777 log |
2 |
chmod: changing permissions of ‘log’: Operation not permitted |
3 |
user@server:/var/www$ sudo !! |
4 |
sudo chmod 777 log |
Se esquecemos a sintaxe de um comando ou estamos preguiçosos em relação a digitar algum comando, podemos usar history
para mostrar o histórico de comandos. É bom combiná-lo com filtros, como o grep
ou tail
para encontrar exatamente o que precisamos.
1 |
history | tail |
2 |
history | grep crontab |
3 |
history | egrep -i 'ssh|ftp' |
Conclusão
Usar o terminal não é ciência espacial. Sistemas Unix e Linux são fáceis de entender e usar por seus projetos simples e ótima documentação. Espero que esse artigo tenha tornado-o mais confortável com a linha de comando e levado-o ao próximo nível de administração de aplicações web no terminal.
Quaisquer dúvidas ou há algum comando que você acredita deveria estar aqui, não deixe de comentar na seção abaixo.