Com o tempo, a maioria dos aficionados do Linux acumula um baú de guerra cheio de truques duramente conquistados que podem ser extremamente úteis quando uma situação exige raciocínio rápido em seu terminal. Eu guardei muitos desses conhecimentos ao longo dos anos e sempre que tive a oportunidade de observar alguém excepcionalmente versado em Linux. Hoje, você está emparelhando comigo no terminal. Estamos explorando as profundezas do sistema de arquivos Linux e ferramentas e truques de shell. Faça um comigo /proc Um dos diretórios mais úteis em um sistema Linux é . Na página de do : /proc man proc O sistema de arquivos proc é um pseudo-sistema de arquivos que fornece uma interface para as estruturas de dados do kernel. Quando a página do diz "pseudo-filesystem", significa que se você espiar embaixo do seu disco, onde pode esperar encontrar bits representando um arquivo como faria para um arquivo de texto em , há nada em . Ele está presente e ativo em um sistema Linux em execução, mas totalmente ausente se você retirar o disco e inspecioná-lo. um painel de controle para o kernel em execução! man /tmp/launch-codes.txt /proc /proc Se você der uma olhada em seu próprio agora, poderá encontrar muitos diretórios como o seguinte: /proc ls /proc 1 10 10021 10059 10144 ...hundreds more files... Cada um desses números representa um ID de processo, ou – sim, o mesmo que identifica o processo para seu navegador ou programa de terminal. Na verdade, você pode interrogar muitas informações sobre o próprio processo. Por exemplo, você deve se lembrar que o processo em um sistema Linux é tradicionalmente o processo de nível superior, que na maioria dos sistemas modernos é baseado em systemd. Vamos ver o comando que iniciou o no meu sistema: PID PID 1 init PID 1 cat /proc/1/cmdline /run/current-system/systemd/lib/systemd/systemd é um arquivo que nos informa o comando que iniciou o processo - neste caso, o próprio . cmdline 1 systemd Há um arquivo em que é particularmente útil - , que na verdade mostra os argumentos passados para o próprio kernel no momento da inicialização. O meu é muito prolixo, mas me diz o com o qual meu sistema inicializou, junto com quaisquer outros sinalizadores, que no meu caso é e : cmdline /proc /proc/cmdline initrd init loglevel cat /proc/cmdline initrd=\efi\nixos\hx5g5rmvq748m64r32yjmpjk3pmgqmr1-initrd-linux-5.17.11-initrd.efi init=/nix/store/9zvklk45yx41pak2hdxsxmmnq12n712k-nixos-system-diesel-22.05.20220604.d9794b0/init loglevel=4 Meu hostname NixOS é . Observe que não coloco petróleo no meu laptop. diesel também não é apenas somente leitura. Como diz sua página de manual, é uma para o kernel, que inclui a interação com o próprio kernel. O diretório contém uma variedade de botões e mostradores, mas quero mostrar a você , que nos permite espiar a memória virtual do kernel. Quer se aventurar mais? /proc /proc interface /proc/sys /proc/sys/vm Considere o uso de memória atual da minha máquina. free -h total used free shared buff/cache available Mem: 31Gi 22Gi 3.0Gi 4.4Gi 5.6Gi 3.6Gi Swap: 31Gi 130Mi 31Gi Nada muito incomum aqui – mas e se eu quisesse liberar minha memória agressivamente? Na maioria das vezes, o kernel sabe melhor quando se trata de usar memória para cache, mas há algumas situações em que você pode querer limpar qualquer memória que seja segura para limpar - não queremos interromper nenhum processo em execução, apenas recuperar memória, se possível. Acontece que há um arquivo para isso. Canalizamos um comando em porque geralmente é protegido contra gravação e somente o pode gravar no arquivo em que estamos interessados. echo sudo tee /proc/sys/vm root echo 1 | sudo tee -a /proc/sys/vm/drop_caches O que esse comando faz é efetivamente sinalizar para o kernel, "por favor, elimine todos os caches na memória que você pode perder sem interromper nenhum processo em execução no meu sistema". Na minha máquina, isso abre cerca de 500M de memória: total used free shared buff/cache available Mem: 31Gi 22Gi 3.5Gi 4.4Gi 5.1Gi 3.6Gi Swap: 31Gi 130Mi 31Gi Legal! Existem todos os tipos de objetos úteis semelhantes a arquivos em que podem fazer coisas interessantes como esta. Sinta-se à vontade para abrir se quiser saber mais. /proc man proc como um pré-histórico /dev curl Um dispositivo de caractere como representa um disco anexado, mas há outro uso para o caminho : uma maneira pouco conhecida de enviar solicitações de rede. /dev/sda /dev O caminho não é realmente um dispositivo semelhante a um arquivo exposto pelo kernel do Linux, mas sim um recurso do shell escolhido como . Os shells podem interceptar operações neste caminho para abrir conexões de soquete de baixo nível para terminais remotos, como servidores da Web que escutam na porta . /dev/tcp bash 80 Para começar, abra um novo descritor de arquivo conectado a um caminho de arquivo em que indique o terminal e a porta desejados. Assim como os números do descritor de arquivo 0, 1 e 2 representam , e , respectivamente, você pode pensar nesse novo descritor de arquivo 3 como representando um canal para um terminal de rede remoto. Assumiremos o uso de daqui em diante. /dev/tcp stdin stdout stderr bash exec 3<>/dev/tcp/httpbin.org/80 Em seguida, envie a forma de texto simples de uma solicitação HTTP simples para o descritor de arquivo aberto. Essa solicitação para também requer que o cabeçalho seja definido para ser tratado adequadamente pela maioria dos proxies reversos. Duas novas linhas sinalizam o término da solicitação: GET /status/200 Host echo -e "GET /status/200 HTTP/1.1\r\nHost: httpbin.org\r\n\r\n" >&3 Por fim, uma simples operação de leitura recupera a resposta HTTP: cat <&3 Você deve ver uma resposta semelhante à abaixo: HTTP/1.1 200 OK Date: Fri, 10 Jun 2022 21:39:43 GMT Content-Type: text/html; charset=utf-8 Content-Length: 0 Connection: keep-alive Server: gunicorn/19.9.0 Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Parabéns! Você acabou de enviar uma solicitação HTTP usando nada além de seu shell. Nadar em /sys Há mais um diretório de nível raiz para explorar depois de mergulhar em e : o enigmático . /proc /dev /sys Como e , é outra interface semelhante a arquivo para mecanismos de baixo nível que ficam muito próximos do sistema operacional. Ao contrário - que é relativamente focado no processo - e - que modela dispositivos de bloco e mais - é uma interface útil para muitas abstrações que o kernel modela. /proc /dev /sys /proc /dev /sys Por exemplo, pegue o diretório . Dentro desse diretório, você encontrará uma lista de links que representam as interfaces de rede em seu host. Veja como é o meu: /sys/class/net ls /sys/class/net enp0s20f0u6u4u1 lo tailscale0 wlan0 Como você pode ver, as conexões de rede ativas que meu sistema está gerenciando incluem uma interface com fio (a interface que começa com ), a interface loopback, uma interface e minha interface sem fio . Listar o conteúdo de um desses diretórios revela uma longa lista de arquivos, mas vamos examinar mais de perto dois arquivos em particular para minha interface de rede com fio: en lo Tailscale wlan0 cat /sys/class/net/enp0s20f0u6u4u1/statistics/rx_bytes cat /sys/class/net/enp0s20f0u6u4u1/statistics/tx_bytes 11281235262 274308842 Cada um desses arquivos representa o número de bytes recebidos e bytes transmitidos, respectivamente. Confira como os números mudam se eu usar o mesmo comando alguns segundos depois: cat /sys/class/net/enp0s20f0u6u4u1/statistics/rx_bytes cat /sys/class/net/enp0s20f0u6u4u1/statistics/tx_bytes 11289633209 274760138 Números maiores! Aparentemente, estou aproveitando ao máximo minha largura de banda. Como isso é útil? Você já se perguntou como os widgets de uso da rede são escritos? Bem, que tal fazer o seu? Confira este pequeno script que usa os arquivos mencionados no diretório de para derivar uma taxa de atividade de rede. bash statistics interval=1 interface=$1 rx_bytes=$(cat /sys/class/net/$interface/statistics/rx_bytes) tx_bytes=$(cat /sys/class/net/$interface/statistics/tx_bytes) rx_bytes_rate=0 tx_bytes_rate=0 function fmt() { numfmt --to=iec-i --suffix=B $1 } while true do echo -en " $(fmt $tx_bytes_rate)/s ⬆ $(fmt $rx_bytes_rate)/s ⬇\t\r" sleep $interval old_rx_bytes=$rx_bytes old_tx_bytes=$tx_bytes rx_bytes=$(cat /sys/class/net/$interface/statistics/rx_bytes) tx_bytes=$(cat /sys/class/net/$interface/statistics/tx_bytes) tx_bytes_rate=$(( ($tx_bytes - $old_tx_bytes) / $interval )) rx_bytes_rate=$(( ($rx_bytes - $old_rx_bytes) / $interval )) done Você pode colocar esse script em algum lugar do seu , torná-lo executável com e testá-lo com . Aqui está a aparência da saída na minha máquina: $PATH chmod +x <script> script.sh <interface name> 13KiB/s ⬆ 379KiB/s ⬇ Isso é bem legal! Você pode imaginar alguns usos para isso: por exemplo, como um widget para uma ferramenta que pode renderizar a saída do comando ou como uma maneira rápida de observar a atividade de rede para uma interface de rede específica. Em ambos os casos, a interface baseada em arquivo para esses dados torna o acesso e o uso excepcionalmente fácil. Exploração adicional Este foi apenas um pequeno mergulho nos tipos de informações disponíveis à medida que você examina mais profundamente os recursos de um sistema Linux moderno. Você pode procurar por guias adicionais como este ou ir direto à fonte lendo as páginas do para entradas como para ler a função e o propósito de vários diretórios em . man man hier / Divirta-se explorando!