Os links simbólicos são quase universais no Linux, mas eles não existem em nenhum outro lugar (exceto no Cygwin que os emula). também existem no AIX e Solaris, mas não são links simbólicos. Portably, para obter informações sobre arquivos abertos, instale ./proc/PID/fd/NUM
/proc/PID/fd/NUM
lsof
Unices with /proc/PID/fd
No Linux, existe um link simbólico levemente mágico para o arquivo que o processo com o ID PID abriu no descritor de arquivo NUM . Esse link é mágico, pois, por exemplo, ele pode ser usado para acessar o arquivo, mesmo que ele seja removido. O link também rastreará o arquivo através de renomeações. é um link simbólico mágico que aponta para onde o PID é o processo que acessa o link./proc/PID/fd/NUM
/proc/self
/proc/PID
Esse recurso está presente em praticamente todos os sistemas Linux. Ele é fornecido pelo driver para o sistema de arquivos proc , que é tecnicamente opcional, mas é usado para muitas coisas (inclusive para fazer o ps
trabalho - lê-se ) que quase nunca é deixado de fora, mesmo em sistemas embarcados./proc/PID
Cygwin
Cygwin emula Linux's (para processos Cygwin) e ./proc/PID/fd/NUM
/proc/self
Solaris (desde a versão 2.6), AIX
Existem entradas para cada descritor de arquivo, mas elas aparecem como o mesmo tipo que o arquivo aberto e, portanto, não fornecem informações sobre o caminho do arquivo. No entanto, eles relatam as mesmas informações que relatariam ao processo que tem o arquivo aberto, portanto, é possível determinar em qual sistema de arquivos o arquivo está localizado e seu número de inode. Os diretórios aparecem como links simbólicos, no entanto, são links simbólicos mágicos que só podem ser seguidos e retornam uma string vazia./proc/PID/fd
stat
fstat
readlink
No AIX, o procfiles
comando exibe algumas informações sobre os arquivos abertos de um processo. No Solaris, o pfiles
comando exibe algumas informações sobre os arquivos abertos de um processo. Isso não inclui o caminho para o arquivo (no Solaris, desde o Solaris 10, veja abaixo).
Além disso , as versões modernas do Solaris possuem links simbólicos semelhantes aos links simbólicos do Linux . O comando mostra informações sobre os arquivos abertos de um processo, incluindo caminhos./proc/PID/fd/NUM
/proc/PID/path/NUM
/proc/PID/fd/NUM
pfiles
/proc/PID/fd
é um arquivo de texto que contém um registro (linha) por descritor de arquivo aberto pelo processo. O nome do arquivo não é rastreado lá.
/proc/PID/
é um diretório, mas não contém nenhuma informação sobre descritores de arquivo.
Unices com /proc
mas sem acesso direto aos descritores de arquivos
(Nota: às vezes é possível obter informações sobre os arquivos abertos de um processo, vasculhando sua imagem de memória que está acessível em /proc
. Não conto isso como "acesso direto".)
Unifica onde está um arquivo/proc/PID
O sistema de arquivos proc começou na 8ª edição do UNIX, mas com uma estrutura diferente, e passou pelo Plano 9 e voltou para alguns departamentos. Eu acho que todos os sistemas operacionais com /proc
uma entrada têm para cada PID, mas em muitos sistemas, é um arquivo regular, não um diretório. Os seguintes sistemas têm um que precisa ser lido com :/proc/PID
ioctl
- Solaris até 2,5
- OSF / 1 agora conhecido como Tru64
- IRIX (?)
- SCO (?)
O MINIX 3 possui um servidor procfs que fornece vários componentes semelhantes ao Linux, incluindo diretórios. No entanto, isso não existe, não ./proc/PID/
/proc/PID/fd
O FreeBSD possui diretórios, mas eles não fornecem informações sobre descritores de arquivos abertos. (No entanto, é semelhante ao Linux , dando acesso ao executável através de um link simbólico.)/proc/PID/
/proc/PID/file
/proc/PID/exe
O procfs do FreeBSD está obsoleto .
Unices sem /proc
- HP-UX
- OpenBSD
- NetBSD
- Mac OS X
Informações do descritor de arquivo por outros canais
O fuser
comando lista os processos que têm um arquivo especificado aberto ou um arquivo aberto no ponto de montagem especificado. Este comando é padrão (disponível em todos os sistemas compatíveis com XSI , ou seja, POSIX com o X / Open System Interface Extension).
Você não pode passar de um processo para nomes de arquivos com este utilitário.
Lsof significa "listar arquivos abertos". É uma ferramenta de terceiros , disponível (mas geralmente não faz parte da instalação padrão) para a maioria das variantes unix. A obtenção de informações sobre arquivos abertos depende muito do sistema, pois a análise acima pode ter feito você suspeitar. O mantenedor lsof fez o trabalho de combinar tudo isso em uma única interface.
Você pode ler as Perguntas frequentes para ver quais tipos de dificuldades o lsof tem de aturar. Na maioria das unidades, a obtenção de informações sobre os nomes dos arquivos abertos requer a análise das estruturas de dados do kernel. Citando a partir da FAQ 3.3 "Por que o lsof não informa nomes de caminhos completos?":
O Lsof não pode obter os componentes do nome do caminho nos caches de nomes do kernel dos seguintes dialetos:
Somente o kernel do Linux registra nomes de caminhos completos nas estruturas que mantém sobre arquivos abertos; em vez disso, a maioria dos kernels converte nomes de caminhos em dupletos de número de dispositivo e nó e os usa para referências de arquivo subseqüentes depois que os arquivos forem abertos.
Se você precisar analisar as informações da lsof
saída de, certifique-se de usar o -F
modo (um campo por linha), de preferência o -F0
modo (campos delimitados por nulo). Para obter informações sobre um descritor de arquivo específico de um processo específico, use a -a
opção com e , por exemplo .-p PID
-d NUM
lsof -a -p 123 -d 0 -F0n
/dev/fd/NUM
para descritores de arquivo do processo atual
Muitas variantes do unix fornecem uma maneira de um processo acessar seus arquivos abertos por meio de um nome de arquivo: abertura é equivalente a chamada . Esses nomes são úteis quando um programa deseja um nome de arquivo, mas você deseja passar um arquivo já aberto (por exemplo, um cano ou soquete); por exemplo, os shells que implementam a substituição do processo os utilizam quando disponíveis (usando um pipe nomeado temporário quando não está disponível)./dev/fd/NUM
dup(NUM)
/dev/fd
Onde /dev/fd
existe, também costuma haver (sempre?) Sinônimos (algumas vezes links simbólicos, outras vezes hard links, outras vezes arquivos mágicos com propriedades equivalentes) /dev/stdin
= /dev/fd/0
, /dev/stdout
= /dev/fd/1
, /dev/stderr
= /dev/fd/2
.
- No Linux,
/dev/fd
é um link simbólico para /proc/self/fd
.
- Na maioria dos departamentos ( IRIX , OpenBSD , NetBSD , SCO, Solaris ,…), as entradas
/dev/fd
são dispositivos de caracteres. Eles geralmente aparecem se o descritor de arquivo está aberto ou não e as entradas podem não estar disponíveis para descritores de arquivo acima de um determinado número.
- No FreeBSD e OSX, o sistema de arquivos fdescfs fornece um
/dev/fd
diretório dinâmico que segue os descritores abertos do processo de chamada. Uma estática /dev/fd
está disponível /dev/fd
e não está montada.
- Sob OSF / 1 (Tru64),
/dev/fd
é fornecido via fdfs .
- Não há
/dev/fd
no AIX ou HP-UX.
pfiles
comando mostra o caminho dos descritores de arquivo. Ele recupera essas informações do/proc/<pid>/path
diretório que você também pode mencionar. Consulte docs.oracle.com/cd/E19253-01/817-0547/esxiq/index.htmlO modo
/proc
é implementado e os recursos que ele fornece não são padronizados de forma alguma, veja, por exemplo, aqui . De acordo com a Wikipedia, o FreeBSD está "desaparecendo"/proc
, veja aqui para detalhes .A partir de
/dev
,/dev/fd/
não faz parte do POSIX ou da Single User Specification (SUSv3), enquanto o System V e o BSD o suportam.Termo aditivo:
Linux:
/dev/fd/*
são links simbólicos para/proc/self/fd
.FreeBSD:
/dev/fd/*
é fornecido através do fdescfs.NetBSD: igual ao FreeBSD.
OpenBSD: igual ao FreeBSD.
Solaris: tem
/dev/fd/*
.IRIX: tem
/dev/fd/*
.Tru64 Unix:
/dev/fd/*
segundo o nixdoc.net , a documentação genuína do Tru64 na HP é inescrutável (garoto, que bagunça! Você não encontra nada!).AIX: nenhuma indicação encontrada na documentação publicamente disponível.
HP-UX: igual ao AIX.
fonte
/dev/fd/1
em um BSD que vincula ao meu atual1>
? Uma coisa que eu costumo fazer no linux éecho 'command' | . /dev/fd/0
- é provável que esse tipo de coisa funcione de maneira geral, você acha?