Como posso determinar se um processo é um processo do sistema?

3

Estou lendo o diretório /proc (ou pseudo-fs) para encontrar todos os processos. Estou recebendo as informações necessárias de /proc/[pid]/status , mas há outra coisa de que preciso. Existe alguma maneira de descobrir quais processos são críticos para o sistema? por exemplo, usando parent-pid ou UID do processo?

Por processo de sistema, quero dizer processos que existiriam em uma nova instalação do sistema operacional e antes de instalar qualquer aplicativo ou serviços. Isso pode não significar encadeamentos do kernel, ou processos do sistema, mas, para resumir, quero dizer processos, que sua terminação, iria interromper a estrutura fundamental do sistema.

PS. Estou trabalhando em um aplicativo para Android, mas como essa parte é feita usando o sistema de arquivos Linux puro, perguntei aqui e não acho que haveria outra diferença.

    
por Milad.Nozari 21.03.2015 / 11:35

3 respostas

5

Se você tiver htop , você pode pressionar Shift + k para alternar a exibição dos encadeamentos do kernel. Se você pressionar F5 para o modo árvore, todos eles devem aparecer como filhos de kthreadd .

There are some visible differences between a kernel thread and a user-space thread:

  • /proc/$pid/cmdline is empty for kernel threads - this is the method used by ps and top to distinguish kernel threads.

  • The /proc/$pid/exe symbolic link has no target for kernel threads - which makes sense since they do not have a corresponding executable on the filesystem.

More specifically, the readlink() system call returns ENOENT ("No such file or directory"), despite the fact that the link itself exists, to denote the fact that the executable for this process does not exist (and never did).

Therefore, a reliable way to check for kernel threads should be to call readlink() on /proc/$pid/exe and check its return code. If it succeeds then $pid is a user process. If it fails with ENOENT, then an extra stat() on /proc/$pid/exe should tell apart the case of a kernel thread from a process that has just terminated.

  • /proc/$pid/status is missing several fields for most kernel threads - more specifically a few fields related to virtual memory.

A resposta acima de Identificando os tópicos do kernel

Outra maneira de distinguir os encadeamentos do kernel de outro processo é executar top -c . Do manual top :

3. COMMAND -- Command Name or Command Line
Display the command line used to start a task or the name of the associated program. You toggle between command line and name with 'c', which is both a command-line option and an interactive com‐ mand.

When you've chosen to display command lines, processes without a command line (like kernel threads) will be shown with only the program name in brackets, as in this example:
[ mdrecoveryd ]

A execução de ps aux também exibe processos que foram iniciados sem um comando entre colchetes (e terão um arquivo /proc/[pid]/cmdline vazio).

Exemplo:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        19  0.0  0.0      0     0 ?        S<   Mar02   0:00 [kworker/1:0H] 

Veja o pacote procps-3.2.8 arquivo /proc/readproc.h .

// Basic data structure which holds all information we can get about a process.
// (unless otherwise specified, fields are read from /proc/#/stat)
//
// Most of it comes from task_struct in linux/sched.h
    
por 21.03.2015 / 12:16
1

Você não pode. “Processo do sistema” não é uma noção bem definida. "Crítico ao sistema" não é uma propriedade universal, sim ou não.

Estou escrevendo este post em um PC de mesa. Ele tem o Apache instalado, mas não é "crítico para o sistema" nesta máquina - eu só o uso ocasionalmente para testar coisas. Por outro lado, em um servidor da Web voltado para o público ou para a empresa, o Apache seria essencial. Por outro lado, um servidor X não é crítico na maioria dos servidores, mas em uma estação de trabalho, é essencial.

Não há atalho. Se você quer saber se matar um processo vai quebrar alguma coisa, você precisa entender o que o processo está fazendo. Se você não sabe o que um processo está fazendo, suponha que isso seja crítico.

“Processos que existiriam em uma nova instalação do sistema operacional e antes de instalar qualquer aplicativo ou serviço” também não são um conceito bem definido. Os serviços podem ser críticos em um sistema específico, mesmo que não façam parte da instalação padrão (por exemplo, Apache). Por outro lado, os serviços podem ser incluídos na instalação padrão, mas não ser críticos em um sistema específico (por exemplo, um serviço de gerenciamento de rede em um sistema sem conexão de rede).

No Android, que não é um sistema Linux (é um sistema diferente usando o kernel do Linux), você pode chamar qualquer coisa que esteja passando por /system de um “processo do sistema”. Esta definição é um pouco significativa no Android, ao contrário do Unix, porque separa claramente o sistema básico dos aplicativos instalados pelo usuário. O sistema básico inclui aplicativos pré-instalados (telefone, Gmail, etc.), com uma seleção diferente, dependendo do fornecedor do telefone (fabricante ou operador de rede). Uma mudança nessa definição é que os aplicativos com /data , mas para os quais existe uma entrada em /system/app , também são aplicativos de "sistema" por essa definição, apenas aqueles que foram atualizados.

    
por 21.03.2015 / 21:56
-2

Sim, em / proc / [pid] / status, há entrada de UID. Se a entrada é igual a:

UID:    0    0    0    0
UID: real UID, effective UID, saved set UID, file system UID

significa que o processo pertence à raiz.

Além disso, a maioria dos processos de raiz tem o pai pid (PPid) na faixa de 0 a 2.

    
por 21.03.2015 / 11:44