Você precisa dar uma olhada nas páginas man do proc . Veja /proc/[pid]/*
entradas e escolha quais arquivos você deseja.
Você não quer copiar tudo. Como exemplo você tem
/proc/[pid]/mem
, que é toda a memória virtual para um processo incluindo
compartilhado etc. - ou seja, o tamanho de toda a sua memória. Além disso, você não poderá lê-lo, a menos que o processo tenha mem
ou seja ptraced
e lido com privilégios mais altos. (E então somente Tamanho Virtual - /proc/pid/status -> VmSize
) - e assim por diante.
Ou /proc/PID/exe
, que é simplesmente um link para o executável, /proc/PID/fd/*
, que contém descritores de arquivo para stdin
, stdout
, stderr
e outros arquivos,
tubos etc.
Também há muitos outros arquivos especiais , e muitos links (se você seguir todos eles, nunca será feito). Leia o homem mencionado acima, documentação do kernel.org , etc.
Além disso, os arquivos não são arquivos de dispositivo de bloco. Eles residem na memória como proc é um sistema de arquivos baseado em memória. De certa forma, você pode chamar isso de janela para o kernel organizados para facilitar o acesso.
Assim, esta é também uma grande vantagem quando se trata das leituras parece que você quer - como a informação reside na memória não há nenhum disco I / O e, portanto, muito rápido. Claro, se você escolher gravar os dados no disco, isso é perdido - mas ainda é muito mais rápido do que disco para disco.
Olhe como memória compartilhada e tente não duplicar mais do que o necessário.
Para sua tarefa, você provavelmente também veria arquivos no nível raiz de
%código%. Veja o código-fonte para /proc
, ps
, top
etc. para obter uma rápida
introdução de como outras ferramentas o fazem.
Escrevi algumas outras respostas que podem mais ou menos tocar alguns dos aspectos. Você pode achar útil:
- Top e o ps não estão sendo exibidos o mesmo resultado da cpu
- htop informando muito maior uso de memória do que livre ou superior
- Por que o rsync não consegue copiar arquivos de / sys no Linux?
Editar:
Quanto ao comentário. Você poderia fazer algo como:
save_to=/some/path
pushd /proc
for d in [0-9]*; do
cp "$d/cmdline" "$save_to/$d.cmdline"
cp "$d/status" "$save_to/$d.status"
done
popd
Mas eu teria usado algum nível inferior como, por exemplo, C para analisar os arquivos como o método acima bastante possível não seria rápido o suficiente para o que se deseja.
Se for uma cópia única a cada hora, OK, mas não para, por exemplo, segundos ou até intervalo de alguns minutos.