Guides
Fundamentos ▾
Versionamento ▾
Deploy ▾

Linux

Referência completa para desenvolvedores — filesystem, processos, texto, rede, serviços, scripting.

Filesystem Hierarchy (FHS)

/
├── bin/ binários essenciais (ls, cp, mv, bash)
├── sbin/ admin (iptables, fdisk, sshd)
├── etc/ arquivos de configuração
├── home/ diretórios dos usuários (/home/alfredo)
├── root/ home do root
├── usr/
│ ├── bin/ binários instalados por pacotes
│ ├── local/ instalações manuais (nvim, scripts próprios)
│ └── share/ man pages, fonts, documentação
├── var/
│ ├── log/ logs do sistema e serviços
│ ├── lib/ dados persistentes (docker, databases)
│ └── cache/ cache de pacotes e apps
├── tmp/ temporários — apagados no reboot
├── proc/ virtual — info de processos e kernel
├── sys/ virtual — hardware e parâmetros do kernel
├── dev/ dispositivos (sda, tty, null, random)
├── mnt/ pontos de montagem manuais
└── boot/ kernel e bootloader

Arquivos e Diretórios

# listar
ls -la          # tudo + permissões + dono
ls -lh          # tamanhos legíveis (K, M, G)
ls -lt          # ordenado por data

# criar / deletar
mkdir -p dir/sub/outro
touch arquivo.txt
rm arquivo.txt
rm -rf dir/     # CUIDADO — recursivo sem confirmação

# copiar / mover
cp -r dir/ copia/
mv arquivo.txt /outro/lugar/

# buscar
find . -name "*.log"
find . -type f -size +10M
find . -name "*.js" -not -path "*/node_modules/*"
find /var/log -mtime -7   # modificados nos últimos 7 dias

Permissões

-rwxr-xr--   1 alfredo sudo 4096 Jun 27 script.sh
rwx
dono (user)
r-x
grupo
r--
outros
OctalBinárioPermissõesUso típico
7111rwxdono de executável
6110rw-arquivos do dono
5101r-xgrupo de executável
4100r--leitura pública
0000---sem acesso
chmod 755 script.sh        # rwxr-xr-x
chmod 644 arquivo.txt      # rw-r--r--
chmod 600 ~/.ssh/id_ed25519   # rw------- (chave privada)
chmod +x script.sh         # adicionar execução
chmod -R 755 /var/www/     # recursivo

chown alfredo arquivo.txt
chown alfredo:sudo arquivo.txt
chown -R www-data:www-data /var/www/html/

# bits especiais
chmod u+s binário    # SUID — executa como dono
chmod g+s dir/       # SGID — herda grupo do diretório
chmod +t /tmp/       # Sticky — só dono apaga seus arquivos

Usuários e Grupos

id                        # uid, gid, grupos do usuário atual
who / w                   # usuários logados
last                      # histórico de logins

sudo adduser alfredo              # criar (interativo)
sudo usermod -aG sudo alfredo     # adicionar ao grupo sudo
sudo usermod -aG docker alfredo   # adicionar ao grupo docker
sudo usermod -s /bin/zsh alfredo  # mudar shell
sudo passwd alfredo               # definir senha
sudo userdel -r alfredo           # remover + home

getent group docker       # membros do grupo
groups alfredo            # grupos de um usuário

su - alfredo              # trocar usuário
sudo -u alfredo cmd       # executar como outro usuário
sudo visudo               # editar sudoers com validação

Processos

ps aux                    # todos os processos
ps aux | grep nginx
pgrep nginx               # só os PIDs
pstree                    # árvore

# monitorar
htop                      # interativo
watch -n 2 'ps aux | grep node'   # repetir a cada 2s

# background / foreground
comando &                 # iniciar em background
jobs                      # listar jobs
fg %1 / bg %1             # trazer / enviar para background
Ctrl+Z                    # suspender
Ctrl+C                    # encerrar

# nohup — sobrevive ao logout
nohup node server.js > /var/log/app.log 2>&1 &

# matar
kill PID                  # SIGTERM (gracioso)
kill -9 PID               # SIGKILL (forçado)
kill -HUP PID             # SIGHUP (reload)
pkill -f "node server"    # por padrão no comando

# prioridade (nice: -20 mais prio → 19 menos)
nice -n 10 cmd
renice 15 -p PID

# ver o que processo usa
lsof -p PID               # arquivos abertos
lsof -i :3000             # processo na porta 3000

Sinais

SIGTERM
15 · kill PID
encerrar graciosamente. Pode ser capturado.
SIGKILL
9 · kill -9 PID
matar imediatamente. Não pode ser ignorado.
SIGHUP
1 · kill -HUP PID
reload de configuração. Usado por nginx, sshd.
SIGINT
2 · Ctrl+C
interrupção do teclado.
SIGSTOP
19 · Ctrl+Z
pausar. Não pode ser ignorado.
SIGCONT
18
retomar processo pausado.

Visualizar Texto

cat arquivo.txt
cat -n arquivo.txt         # com número de linha
less arquivo.txt           # paginado (q sair, /busca, n próximo)
head -n 20 arquivo.txt     # primeiras 20 linhas
tail -n 50 arquivo.txt     # últimas 50
tail -f /var/log/nginx/access.log   # seguir em tempo real
tail -F arquivo.log        # seguir com rotação de log

grep / ripgrep

grep "pattern" arquivo.txt
grep -i "pattern" arquivo.txt   # case-insensitive
grep -r "pattern" dir/          # recursivo
grep -n "pattern" arquivo.txt   # com número de linha
grep -v "pattern" arquivo.txt   # inverso (não bate)
grep -l "pattern" *.txt         # só nomes dos arquivos
grep -E "regex+" arquivo.txt    # extended regex
grep -A 3 "error" arquivo.log   # 3 linhas após o match
grep -B 2 -A 2 "error" log.txt  # contexto ao redor

# rg (ripgrep) — muito mais rápido
rg "pattern" dir/
rg -t js "useState"             # filtrar por tipo de arquivo
rg -i "error" --glob "*.log"

sed

sed 's/foo/bar/' arquivo.txt         # primeira ocorrência por linha
sed 's/foo/bar/g' arquivo.txt        # todas
sed -i 's/foo/bar/g' arquivo.txt     # editar in-place
sed -i.bak 's/foo/bar/g' arquivo     # com backup .bak

sed '/pattern/d' arquivo.txt         # deletar linhas com pattern
sed '5d' arquivo.txt                 # deletar linha 5
sed -n '10,20p' arquivo.txt          # imprimir linhas 10-20
sed -n '/START/,/END/p' arquivo.txt  # entre padrões

awk

awk '{print $1}' arquivo.txt          # primeira coluna
awk -F: '{print $1}' /etc/passwd      # separador personalizado
awk '$3 > 1000' arquivo.txt           # filtrar por valor
awk '{sum += $2} END {print sum}' dados.txt   # somar coluna

# processos com mais de 1% de CPU
ps aux | awk '$3 > 1.0 {print $0}'

# adicionar numeração de linha
awk '{print NR": "$0}' arquivo.txt

Outros Utilitários de Texto

cut
Extrair colunas ou chars. cut -d: -f1 /etc/passwd
sort
Ordenar. sort -n numérico, -r reverso, -u único
uniq
Remover duplicatas (input deve estar ordenado). uniq -c contar
wc
Contar linhas -l, palavras -w, bytes -c
tr
Transformar chars. tr 'a-z' 'A-Z', tr -d '\r'
tee
Gravar e passar adiante. cmd | tee arquivo.txt
diff
Comparar arquivos. diff -u a b formato patch
xargs
Converter stdin em argumentos. find ... | xargs rm

Redirecionamentos e Pipes

0
stdin
teclado
1
stdout
terminal
2
stderr
terminal
cmd > arquivostdout → arquivo (sobrescreve)
cmd >> arquivostdout → arquivo (append)
cmd 2> errosstderr → arquivo
cmd &> arquivostdout + stderr → arquivo
cmd 2>&1redirecionar stderr para stdout
cmd &>/dev/nulldescartar toda a saída
cmd < entradastdin ← arquivo
cmd1 | cmd2stdout de cmd1 → stdin de cmd2
cmd 2>&1 | cmd2incluir stderr no pipe

Compressão e Arquivos

# tar
tar -czf backup.tar.gz dir/           # criar .tar.gz
tar -xzf backup.tar.gz                # extrair
tar -xzf backup.tar.gz -C /destino/  # extrair em dir específico
tar -tzf backup.tar.gz                # listar sem extrair

# gzip
gzip -k arquivo.txt     # comprimir (manter original)
gunzip arquivo.txt.gz   # descomprimir

# zip
zip -r backup.zip dir/
unzip backup.zip -d /destino/
unzip -l backup.zip     # listar

Disco e Armazenamento

df -h               # espaço nos filesystems
du -sh dir/         # tamanho de diretório
du -sh *            # tamanho de cada item atual
du -sh /* 2>/dev/null | sort -rh | head -10   # maiores dirs

lsblk               # discos e partições
lsblk -f            # com filesystem e UUID
blkid               # UUIDs

Rede

ip addr
substitui ifconfig
Ver endereços IP das interfaces
ss -tulnp
substitui netstat
Portas abertas com processos
ip route
substitui route
Tabela de rotas e gateway
dig
substitui nslookup
Consultas DNS detalhadas
ip addr show eth0
ss -tulnp             # portas abertas com processos
lsof -i :3000         # processo na porta 3000

ping -c 4 google.com
traceroute google.com

dig dominio.com A
dig @8.8.8.8 dominio.com   # DNS específico
nslookup dominio.com

curl -L -o arquivo https://url
curl -I https://url         # só headers HTTP
wget https://url/arquivo

Gerenciamento de Pacotes (apt)

sudo apt update
sudo apt install -y pacote
sudo apt remove pacote          # remove, mantém configs
sudo apt purge pacote           # remove tudo
sudo apt autoremove             # remover dependências órfãs
sudo apt upgrade                # atualizar tudo

apt search nginx
apt show nginx                  # detalhes
dpkg -l | grep nginx            # listar instalados
dpkg -L nginx                   # arquivos do pacote
which nginx                     # localizar binário

Serviços — systemd

sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx       # recarregar config sem parar
sudo systemctl status nginx

sudo systemctl enable --now nginx  # enable + start
sudo systemctl disable nginx

systemctl list-units --type=service --state=running
systemctl list-units --failed

# logs
journalctl -u nginx -f            # seguir em tempo real
journalctl -u nginx -n 100        # últimas 100 linhas
journalctl -u nginx --since "1 hour ago"
journalctl -xe                    # erros recentes com contexto

Unit File

[Unit]
Description=Meu App Node.js
After=network.target

[Service]
Type=simple
User=alfredo
WorkingDirectory=/home/alfredo/apps/meu-app
ExecStart=/home/alfredo/.nvm/versions/node/v20.0.0/bin/node server.js
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production PORT=3000

[Install]
WantedBy=multi-user.target
sudo nvim /etc/systemd/system/meu-app.service
sudo systemctl daemon-reload
sudo systemctl enable --now meu-app

Variáveis de Ambiente

env                          # ver todas
echo $HOME $USER $SHELL $PATH

export VAR=valor              # exportar para processos filhos
VAR=valor cmd                 # só para o comando

export PATH="$HOME/.local/bin:$PATH"   # adicionar ao PATH

# persistir em ~/.zshrc ou ~/.bashrc
echo 'export EDITOR=nvim' >> ~/.zshrc
source ~/.zshrc
ArquivoEscopo
~/.zshrczsh interativo
~/.bashrcbash interativo
~/.profilelogin shell (bash/sh)
/etc/environmentsistema inteiro
/etc/profile.d/*.shscripts de sistema

Cron Jobs

*
minuto
0-59
·
*
hora
0-23
·
*
dia mês
1-31
·
*
mês
1-12
·
*
dia semana
0-7
/cmd
comando
crontab -e          # editar
crontab -l          # listar
sudo crontab -e     # cron do root

# exemplos
0 2 * * *     /usr/bin/backup.sh          # diariamente às 2h
0 2 * * 0     /usr/bin/backup.sh          # domingo às 2h
*/5 * * * *   /usr/bin/check.sh           # a cada 5 min
0 9-18 * * 1-5 /usr/bin/notify.sh        # dias úteis horário comercial
@reboot       /usr/bin/start.sh           # no boot
@daily        /usr/bin/cleanup.sh

Informações do Sistema

uname -a            # kernel + arquitetura
cat /etc/os-release # distro
hostnamectl         # hostname, SO, kernel

lscpu               # CPU
free -h             # RAM
lshw -short         # hardware completo
uptime              # carga do sistema

# tempo real
htop
vmstat 1            # CPU, mem, I/O por segundo
iostat -x 1         # I/O de disco

Shell Scripting

#!/usr/bin/env bash
set -euo pipefail   # sair em erro, tratar vars não definidas, falha em pipe

# variáveis
NAME="alfredo"
echo "Olá, ${NAME}!"

# especiais: $0=script $1..=args $@=todos $#=count $?=exit code $$=PID

# condicional
if [ -f arquivo.txt ]; then
  echo "existe"
elif [ -d dir/ ]; then
  echo "é dir"
else
  echo "não existe"
fi

# [[ ]] — mais robusto no bash
[[ "$str" == *"padrão"* ]]    # glob
[[ "$str" =~ ^[0-9]+$ ]]     # regex

# loops
for f in *.txt; do echo "$f"; done
for i in $(seq 1 10); do echo $i; done
while read -r line; do echo "$line"; done < arquivo.txt

# funções
my_func() {
  local var="local"
  echo "arg: $1"
  return 0
}
RESULT=$(my_func "teste")

# arrays
ARR=("a" "b" "c")
echo ${ARR[@]}        # todos
echo ${#ARR[@]}       # tamanho

# string ops
echo ${#VAR}          # comprimento
echo ${VAR:0:5}       # substring
echo ${VAR:-default}  # default se vazio
echo ${VAR//foo/bar}  # substituir todas

# trap — limpeza ao sair
trap 'rm -f /tmp/lock' EXIT

Dicas e Padrões

# histórico
history | grep docker
Ctrl+r              # busca reversa
!!                  # último comando
!$                  # último argumento

# atalhos readline
Ctrl+a / Ctrl+e     # início / fim da linha
Ctrl+k / Ctrl+u     # cortar até fim / início
Ctrl+w              # apagar palavra anterior
Ctrl+y              # colar

# globbing
*.txt               # todos os .txt
{a,b,c}.txt         # a.txt b.txt c.txt
{1..5}              # 1 2 3 4 5

# misc
time cmd                      # medir tempo
timeout 30 cmd                # matar após 30s
yes | cmd                     # responder 'y' automaticamente
nohup cmd &>/var/log/cmd.log &   # rodar após logout

/proc e /sys

# /proc — virtual, info do sistema
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/loadavg
cat /proc/PID/status      # info do processo
ls /proc/PID/fd/          # file descriptors abertos

# /sys — parâmetros do kernel e hardware em tempo real
cat /sys/class/net/eth0/speed
cat /sys/class/block/sda/size

# sysctl — ajustar parâmetros
sysctl -a                         # ver todos
sudo sysctl -w vm.swappiness=10   # definir temporário
sudo nvim /etc/sysctl.conf        # persistir
sudo sysctl -p                    # recarregar

Referência Rápida

TarefaComando
Ver espaço em discodf -h
Tamanho de diretóriodu -sh dir/
Maiores diretóriosdu -sh /* 2>/dev/null | sort -rh | head -10
Processos usando mais RAMps aux --sort=-%mem | head
Processo na porta Xlsof -i :X
Matar processo por nomepkill nginx
Seguir logstail -f /var/log/syslog
Buscar texto recursivorg "texto" .
Substituir em arquivosed -i 's/old/new/g' arquivo
Permissões numéricasstat -c "%a %n" arquivo
Usuários logadosw
Variáveis de ambienteenv | sort
Serviços ativossystemctl list-units --state=running
Logs de serviçojournalctl -u nome -f
Medir tempo de execuçãotime cmd
Contar linhaswc -l arquivo
Colunas únicas ordenadassort arquivo | uniq -c | sort -rn