Como determinar a memória usada por um processo no Linux, com o utilitário pmap

O utilitário pmap tem a função de exibir um mapa do uso da memória por um ou vários processos.
Com ele, é possível obter um valor, em KB, da quantidade de memória RAM usada por um programa, no seu sistema.
Você precisa informar apenas o PID (Process ID) do programa, para o pmap.
Para obter o PID, use o comando ps.
Use o ps para obter o PID de algum processo. No exemplo, abaixo, veja como obter esta informação sobre o navegador Firefox:


ps aux | grep firefox

justinc+  1889 46.2 10.6 3262532 839236 tty2   Sl+  09:21   9:00 /usr/lib/firefox-esr/firefox-esr
justinc+ 13572  0.0  0.0  12784   992 pts/0    S+   09:40   0:00 grep --color=auto firefox

O PID é exibido na 2a coluna. No meu caso, é 1889.
Agora, basta oferecer este número ao pmap:


pmap 1889

O mapa pode ser bastante extenso e você pode informar mais de um PID, se quiser.
Ao final, é exibido o total de memória (em KB) usada pelo processo.
Use o comando grep, para obter uma visualização mais resumida:


pmap 1889 | grep -i total

 total          3270732K

Você também irá encontrar informações sobre a memória ocupada por processo no diretório /proc ou com os utilitários ps ou top.
O problema destas alternativas é que será necessário calcular o valor total da memória usada “manualmente”, ou seja, adicionar os valores de memória compartilhada, mapeada e virtual, entre outros.
Já o pmap oferece o valor total, de mais fácil compreensão, ao final da listagem.

Use o progress para monitorar processos no Linux

O utilitário progress permite observar o andamento de processos dentro do coreutils.
A ferramenta, escrita em C e voltada para os sistemas operacionais GNU/Linux, exibe o progresso de comandos básicos, como o cp, mv, dd, tar, cat, rsync, grep, fgrep, egrep, cut, sort, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, adb, gzip, gunzip, bzip2, bunzip2, xz, unxz, lzma, unlzma, zcat, bzcat, lzcat etc.

O GNU Core Utilities ou coreutils são o conjunto de utilitários básicos para manipulação de texto, de arquivos e da shell dos sistemas operacionais GNU/Linux.

Se um destes estiver rodando, o progress irá capturar e exibir informações sobre a transferência de dados, o tempo que ainda falta para finalizar etc.
Embora não venha instalado em algumas distribuições, é fácil encontrar o pacote de instalação nos repositórios.
No Debian, use o apt, para fazer a instalação:


sudo apt install progress

Se um dos comandos, citados acima, estiver em execução, a qualquer momento o progress pode capturar informações sobre ele.
Experimente com um procedimento mais demorado, como o cp, para copiar uma quantidade de arquivos grandes de uma unidade para outra.
No meu exemplo, abaixo, iniciei a cópia de um arquivo de backup de mais de 1 GB para uma unidade flash USB.


cp -r Música/ /media/justincase/yellow/ &
[1] 1056

Usei o ‘&’, acima, para enviar o processo para o segundo plano e liberar o terminal para o próximo comando:


progress -w

[ 1056] cp /home/justincase/Música/arquivo-de-musica.flac
    74.9% (32.5 MiB / 43.4 MiB)

Como você pode ver, acima, o progress exibe o progresso da cópia do arquivo atual (74%) e sai.
Você pode invocar o programa outras vezes, para saber o andamento da cópia.
Se achar melhor, pode combiná-lo com o watch, para poder observar o progresso on the fly:


watch progress -w

captura de tela progresso do comando de cópia no Linux
Veja um exemplo de acompanhamento da verificação do shasum da imagem ISO do Ubuntu:


sha512sum ubuntu-17.10-desktop-amd64.iso & watch progress -w

Se houver processos dos coreutils rodando, a ferramenta irá captar e exibir informações sobre todos eles.
Para obter uma visualização mais enxuta, use a opção ‘-q’:


progress -q

[ 2119] sha256sum /home/justincase/Downloads/ubuntu-17.10-desktop-amd64.iso
    7.4% (105.3 MiB / 1.4 GiB)

[ 2118] sha512sum /home/justincase/Downloads/ubuntu-17.10-desktop-amd64.iso
    11.5% (164.3 MiB / 1.4 GiB)

Neste modo, o tempo restante para a conclusão (remaining) de cada processo não é exibido.
Para enxugar, mais ainda, a linha de comando, use as opções ‘-m’ ou ‘-M’.
Elas substituem o uso do watch!


progress -m

Outra vantagem do uso de ‘-m’, é que a tela fica menos suja, após a execução dos comandos, e permite ver melhor o resultado de cada.
O ‘-M’, mantém o monitoramento continuadamente.
Este pode ser ideal, para execução em um terminal à parte, onde os coreutils podem ser capturados e monitorados o tempo todo no seu sistema.

Referências

https://www.gnu.org/software/coreutils/coreutils.html.

https://pt.wikipedia.org/wiki/GNU_Core_Utilities.

Como criar um sistema de arquivos ISO a partir de um diretório no Linux

Em um de meus scripts de backup, inclui uma linha de comando para criar um arquivo (ou sistema de arquivos) .ISO a partir de um diretório compactado em um arquivo .tar.gz
Você pode incluir vários diretórios e arquivos à sua livre escolha. Basta pegar um dos exemplos, abaixo, e editar para atender ás suas necessidades.

Um arquivo .ISO contém um sistema de arquivos completo e pronto para ser gravado em um CD ou DVD. Se preferir, você pode gravar vários destes arquivos em um flash drive (ou pendrive).
É possível usar ferramentas gráficas (GUI) para gravar em mídias óticas, claro. Mas, se deseja incluir o procedimento em um script, para ser executado automaticamente (ideal, em caso de backups), talvez seja melhor saber como se virar na linha de comando (CLI).

São basicamente 2 ferramentas a ser usadas, aqui:

  1. o genisoimage, para criar o sistema de arquivos .ISO e
  2. o growisofs, para gravar o arquivo em mídia.

O uso do mkisofs é superfácil. Basta informar o nome/caminho do diretório que você deseja incluir em uma .ISO:


genisoimage -o temporario.iso temp/

ls -la *.iso

-rw-r--r-- 1 justincase justincase 421M out 30 10:04 temporario.iso

O genisoimage vai criar um arquivo com o nome ‘temporario.iso’ com o conteúdo da pasta temp/.
Você também pode invocar o aplicativo Brasero, a partir da CLI, com o seguinte comando:


brasero --image-file temp/

O Brasero irá gerar um arquivo com nome automático (brasero.iso), caso ele não seja alterado na interface do programa, a partir da pasta temp/.

Como gravar uma imagem ISO em um DVD

Na CLI, você pode usar o utilitário growisofs para queimar um DVD a partir de uma imagem ISO pronta.
É necessário indicar adequadamente o endereço do drive o nome da imagem ISO:


growisofs -dvd-compat -Z /dev/dvdrw=temporario.iso 

WARNING: /dev/dvdrw already carries isofs!
About to execute 'builtin_dd if=temporario.iso of=/dev/dvdrw obs=32k seek=0'
/dev/dvdrw: "Current Write Speed" is 4.1x1352KBps.
   12353536/440578048 ( 2.8%) @2.5x, remaining 2:18 RBU 100.0% UBU   0.3%
   26214400/440578048 ( 6.0%) @3.0x, remaining 1:50 RBU 100.0% UBU  99.4%
   40108032/440578048 ( 9.1%) @3.0x, remaining 1:39 RBU 100.0% UBU  99.4%

...

builtin_dd: 215136*2KB out @ average 3.2x1352KBps
/dev/dvdrw: flushing cache
/dev/dvdrw: reloading tray

A mensagem, acima, “WARNING: /dev/dvdrw already carries isofs!“, é um aviso de que já há conteúdo dentro do DVD-RW.
Fique atento, o comando irá sobrescrever (eliminar) o conteúdo preexistente, sem pedir confirmação.
Com o Brasero, é possível usar uma linha de comando mais enxuta — embora o aplicativo tenha várias outras opções de uso, tal como o growisofs.
Se quiser, basta informar o nome do arquivo .ISO a ser gravado.
Se a mídia não estiver vazia (estou usando um DVD-RW nos meus exemplos), desta vez, você será avisado:


brasero --image=temporario.iso

gravar DVD com BRASERO no Linux

Para usar dentro de um script, cuja execução está projetada para ser automática e sem intervenção humana, esta solução pode ser muito ruim.
Neste caso, tente adicionar a opção ‘–immediately’:


brasero --immediately --image=temporario.iso

Rode a ajuda do Brasero, para descobrir mais opções:


brasero --help-all | more

Como copiar arquivos na linha de comando com exibição do progresso

É possível exibir o progresso da transferência dos dados, à medida em que são copiados no Linux/Unix com o uso do comando de cópia, cp?

A resposta curta é não.
Porém, através de um hack (que vou ensinar neste artigo), é possível fazer cópias de todos os arquivos de um diretório (recursivamente, se você quiser) para outro, com a exibição do progresso da cópia de cada arquivo.

rsync - exemplo de uso - captura de tela
Com o uso do alias, o cp se comporta como o comando rsync.

Se estivermos falando de arquivos muito grandes (áudio, vídeo etc.) será possível acompanhar melhor o processo de cópia na CLI (linha de comando).
Vamos ver como realizar o procedimento com o uso destas 2 ferramentas padrão em qualquer distro GNU/Linux: alias e rsync.
O comando rsync serve para fazer cópias entre diretórios locais e remotos.
Com ele é possível obter um retorno sobre a taxa de progresso da cópia de dados.
Por exemplo, para copiar todos os arquivos da pasta Documentos para /media/justincase/pendrive, use o comando assim:


rsync -ahu --progress Documentos/* /media/justincase/pendrive/

Veja o que o comando faz:

  • -a — estabelece que a transferência ocorra no nível de arquivo.
  • -hhuman readable, indica que o retorno deve ocorrer em Kb/Mb, para tornar a leitura mais fácil.
  • -uupdate, atualiza apenas os arquivos com entradas mais novas, para agilizar o processo. O rsync já faz a cópia incremental, por padrão — ou seja, verifica antes se os arquivos já existem no destino e só copia se houve atualizações.
  • --progress — finalmente, esta é a opção de exibição do progresso da execução da transferência individual da cópia.

Para adicionar recursividade, use a opção ‘-r’:


rsync -ahur --progress Documentos/* /media/justincase/pendrive/

Fique à vontade para alterar os itens da linha de comando, para que ela se encaixe às suas necessidades.
Por fim, altere a função do comando cp, no seu sistema, com o uso do alias:


alias cp="rsync -ahu --progress"

Se preferir que a função de recursividade fique em um comando separado, crie um novo alias:


alias cpr="rsync -ahur --progress"

Veja um exemplo de funcionamento do “novo” cp:


cp ~/Documentos/Documento\ digitalizado* /media/justincase/b655b449-21c6-42ca-b274-5adf9980a843/Documentos/

sending incremental file list
Documento digitalizado-1.jpg
        953.79K 100%   48.80MB/s    0:00:00 (xfr#1, to-chk=11/12)
Documento digitalizado-1.jpg.zip
        917.61K 100%   15.63MB/s    0:00:00 (xfr#2, to-chk=10/12)
Documento digitalizado-1.png
          7.40M 100%   43.27MB/s    0:00:00 (xfr#3, to-chk=9/12)
Documento digitalizado-2.jpg
        407.14K 100%    2.03MB/s    0:00:00 (xfr#4, to-chk=8/12)
Documento digitalizado-2.jpg.zip
        354.94K 100%    1.74MB/s    0:00:00 (xfr#5, to-chk=7/12)
Documento digitalizado-2.png
        483.23K 100%    2.06MB/s    0:00:00 (xfr#6, to-chk=6/12)
Documento digitalizado-3.jpg
        318.37K 100%    1.22MB/s    0:00:00 (xfr#7, to-chk=5/12)
Documento digitalizado-3.jpg.zip
        309.96K 100%    1.17MB/s    0:00:00 (xfr#8, to-chk=4/12)
Documento digitalizado-3.png
        482.62K 100%    1.64MB/s    0:00:00 (xfr#9, to-chk=3/12)
Documento digitalizado-pgto-helio20140513.pdf
        112.15K 100%  359.08kB/s    0:00:00 (xfr#10, to-chk=2/12)
Documento digitalizado.jpg
         30.82K 100%   96.76kB/s    0:00:00 (xfr#11, to-chk=1/12)
Documento digitalizado.png
          7.40M 100%   16.79MB/s    0:00:00 (xfr#12, to-chk=0/12)

Segue um exemplo de uma variação do uso do rsync, que inclui a opção ‘–info=progress2’:


rsync -ah --info=progress2 ~/Documentos/Documento\ digitalizado* /media/justincase/b655b449-21c6-42ca-b274-5adf9980a843/Documentos/

         19.16M 100%  192.03MB/s    0:00:00 (xfr#12, to-chk=0/12)

Neste caso, os dados sobre o progresso se referem à tarefa toda e não apenas a cada arquivo individualmente.
Você pode criar um alias para este modo de operação, se quiser.

Sugestões de alias para usar no Linux

O comando alias permite facilitar a digitação de sequências de comandos muito grandes e/ou muito usadas, unificando tudo em apenas um nome (apelido).
Sugiro a leitura dos artigos relacionados (ao final) na seção de referências, caso queira se aprofundar um pouco mais no assunto.


Se você ainda não conhece o comando, por favor leia esta introdução.
Quando temos um procedimento complexo, que envolve uma série de linhas de comando para ser realizado, podemos montar um script — que, ao ser invocado, realiza toda a tarefa.
Shell scripts não são solução para tudo. Você pode associar uma pequena sequência de comandos a um alias.
Segue alguns exemplos.

Alias para troca de diretórios

O comando atende a heavy users de sistemas GNU/Linux ou UNIX.
Trocas constantes de diretórios, para realizar tarefas administrativas pode ser cansativo — até para quem é rápido no teclado.
Experimente estas sugestões:

# volta para o diretório pai do atual
alias ..="cd .." 

# volta 2 níveis de diretórios
alias ...="cd ../.."

# volta 3 níveis de diretórios
alias ....="cd ../../.." 

Também gosto da seguinte alternativa:

alias .2="cd ../.."
alias .3="cd ../../.."
alias .4="cd ../../../.."

Quando estiver realizando procedimentos em 2 diretórios diferentes e precisar ir e voltar frequentemente entre eles crie um apelido chamado ‘volta’:

alias volta='cd $OLDPWD'

crie alias para ir rapidamente para diretórios específicos:

alias docs="cd ~/Documentos"
alias facul="cd ~/Documentos/faculdade"
alias vids="cd ~/Vídeos"

Atalhos para listagens de diretórios

O comando ls permite uma série de ajustes de parâmetros e opções que podem ser incorporadas todas dentro de apelidos.
Veja algumas sugestões:

alias ll='ls -l'     
alias lf='ls -F'
alias l='ls -al'
alias lm="ls -al | more"

Para o ls sempre sair colorido:

alias ls="ls --color"

Alias para comandos de data e hora

Se você costuma checar o tempo no terminal, experimente estas configurações:

alias d='date +%F'
alias agora='date +"%T"'
alias hoje='date +"%d/%m/%Y"'

Force a confirmação de comandos

Para forçar a confirmação de comandos de copiar, mover ou apagar, sugiro estes:

alias cp='cp -i'
alias ln='ln -i'
alias mv='mv -i'
alias ln='ln -i'

Alias para comandos variados

Estou sempre pesquisando no meu histórico para rever o funcionamento de algum comando dado há algumas semanas atrás.
Criar um apelido para um procedimento que combine o comando history ao more ou ao comando grep é uma ótima ideia:

alias hm="history | more"
alias hg="history | grep -i"

veja um exemplo de uso deste último:


hg getconf

 1500  getconf LONG_BIT
 1502  man getconf
 1533  getconf -a | grep arq
 1534  getconf -a | grep -i bit

Segue um exemplo para encontrar arquivos no sistema:

alias ff="find / -type f -name"

Agora basta indicar o nome do arquivo, após ff:


ff hello.c

Para fazer buscas dentro dos subdiretórios atuais, use o comando assim:


alias buscar="find . -name "

buscar hello

./hello
./python/scripts/hello

O comando mount pode ser ajustado para exibir uma listagem em colunas organizadas:

alias mount="mount |column -t"

Use estes, para obter informações do sistema:

alias df="df -Tha --total"
alias du="du -ach | sort -h"
alias free="free -mt"
alias ps="ps auxf | more"

Note que já existem utilitários com estes nomes (df, du, free e ps).
O alias se sobrepõe ao nome de um comando preexistente.
Uma variante do último alias, da lista acima, permite buscar informações sobre um determinado processo:


alias psg="ps aux | grep -v grep | grep -i -e VSZ -e"

psg bash

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
justinc+ 28944  0.0  0.0  21992  6064 pts/0    Ss   10:26   0:00 bash

Segue algumas sugestões para fazer a atualização do sistema:

alias sau="sudo apt update"
alias alu="apt list --upgradable"
alias saf="sudo apt full-upgrade"

Para desligar, reiniciar, suspender, hibernar ...

# encerrar a sessão no terminal atual
alias sair="exit"   

# reiniciar o sistema
alias reset="systemctl reboot"

# desligar o sistema
alias desligar="systemctl poweroff"

# suspender o sistema
alias suspender="systemctl suspend"

# hibernar
alias hibernar="systemctl hibernate"

No artigo Como copiar arquivos na linha de comando com exibição do progresso da tarefa, ensino um truque interessante, com o uso do rsync e alias.
Não esqueça que as definições em alias são perdidas quando terminamos uma sessão.
Para que sejam persistentes, é necessário gravá-las em arquivos de inicialização do Bash, como .bashrc ou o .bash_profile ou, ainda, .bash_aliases.

Referências

https://www.networkworld.com/article/2782375/operating-systems/unix-tip--useful-unix-aliases.html.

https://www.linuxtrainingacademy.com/23-handy-bash-shell-aliases-for-unix-linux-and-mac-os-x/.

https://www.digitalocean.com/community/tutorials/an-introduction-to-useful-bash-aliases-and-functions.

https://lifehacker.com/398258/ten-handy-bash-aliases-for-linux-users.

https://www.cyberciti.biz/tips/bash-aliases-mac-centos-linux-unix.html.