Como determino o nome do processo de um aplicativo?

13

Esta é a situação:

Trabalhando em (a próxima versão) de um editor da Lista Rápida do Unity, gostaria de adicionar uma maneira confiável de "reiniciar" os ícones do iniciador. Para fazer isso, preciso remover o ícone (editar configurações) e substituí-lo na mesma posição. Até agora não há problema. No entanto, se o aplicativo em questão estiver em execução, o usuário possivelmente perderá dados, pois o aplicativo será encerrado quando o ícone for removido do iniciador. O que eu preciso é de uma maneira confiável de encontrar o nome do processo de um aplicativo, permitir que o editor verifique a lista de processos em execução se o aplicativo estiver em execução e envie uma mensagem de aviso ao usuário de que o ícone não pode ser reiniciado se o aplicativo for corrida.

O que eu fiz até agora foi fazer o editor procurar no arquivo da área de trabalho, ler o comando, também ler o comando, retirado da seção de diretório e, além disso, procurar possíveis scripts remotos aos quais o comando do arquivo da área de trabalho pode se referir, procurando por seqüências iniciadas com "./"

Embora o método pareça funcionar bem com todos os aplicativos em que o testei, tenho a sensação de que deve haver uma maneira mais fácil de cobrir o problema de uma maneira "tudo em um" ...

Existe?

Também sugestões para capturar situações mais excepcionais são bem-vindas!

Jacob Vlijm
fonte
Por que um aplicativo encerra quando seu ícone é removido do iniciador? Sair de um aplicativo que não está afixado ao iniciador faz com que seu ícone seja removido, mas por que a remoção do ícone sairia do aplicativo?
Eliah Kagan
@Eliah: desistir provavelmente não é a expressão correta, a aplicação simplesmente trava ....
Jacob Vlijm
@JacobVlijm então, isso é específico da Unity, certo? A unidade já tem um mecanismo para isso. Quais são os requisitos? Apenas para saber o nome do processo igual ao da saída pse xprop?
Sergiy Kolodyazhnyy 10/10
@Serg O nome do processo "calculado" do .desktoparquivo, que não é necessariamente o WM_CLASS. O WM_CLASS pode ser definido de dentro do aplicativo.
Jacob Vlijm
@JacobVlijm ah, então, suponha que você tenha iniciado firefox.desktop, ele lança o Firefox com PID 1234, mas mudou WM_CLASSpara algo como 'Totally Not Firefox'. O .desktoparquivo, no entanto, não muda. Você deseja que o nome seja anexado ao PID 1234, independentemente de WM_CLASS. Eu acho que vejo exatamente o que precisa ser feito. Mas você não respondeu à minha primeira pergunta - tudo bem se for apenas para o Unity?
Sergiy Kolodyazhnyy 10/10

Respostas:

3

Não há como resolver isso no caso geral. Qualquer que seja o mecanismo que você crie, acredito que sempre será possível escrever um processo que o ilude, a menos que você modifique a maneira como os processos são iniciados em primeiro lugar, a fim de rastreá-los dessa maneira.

O iniciante precisa lidar exatamente com o mesmo problema para rastrear se os daemons ainda estão em execução, e os autores do trabalho inicial precisam especificar detalhes (o número de garfos) para acompanhar. Como o iniciante não pode gerenciá-lo sem ajuda, também não acho que você possa. E o iniciante está mesmo no controle da maneira como os processos são iniciados, o que eu acho que você não está aqui.

Acho que o melhor que você pode fazer é o que já está fazendo. Olhar para /proc/<pid>/state /proc/<pid>/cmdlineé uma maneira razoavelmente geral, mas ainda não pega todos os casos. O pgrepcomando envolve isso. Se você ainda não estiver usando pgrep, dê uma olhada na página de manual do pgrep para opções de itens com os quais você pode comparar.

Dito tudo isso, não estou convencido de que você realmente precise fazer isso em primeiro lugar. Se você não pode acompanhar o processo, também não vejo como o Unity poderia fazer isso. Uma abordagem melhor não seria eliminar as falhas do aplicativo em primeiro lugar? Gostaria de analisar detalhes de por que seus aplicativos estão travando (certamente é um bug em algum lugar?), Em vez de tentar contorná-lo como você descreveu. Gostaria de saber se isso afeta apenas aplicativos compatíveis com o Unity, que estão retornando ao Unity para obter funcionalidade extra via DBus ?

Robie Basak
fonte
Obrigado pela sua resposta completa! Examinarei os detalhes (especialmente o seu último parágrafo) e provavelmente oferecerá o ícone "restart" como uma opção "experimental" se não encontrar 100% de soulution. A boa notícia é que, entretanto, não encontrei exceções no método que usei. Obrigado mais uma vez!
Jacob Vlijm
1

O xpropcomando (seguido de alt-tab na janela do aplicativo relevante e, em seguida, clique uma vez na janela) parece fazer o truque para mim.

el_gallo_azul
fonte
WM_CLASSgeralmente corresponde ao nome do processo, mas definitivamente nem sempre. Definindo (codificando) uma janela, posso dar o WM_CLASSque quiser. Até fiz isso sozinho para criar janelas, executando diferentes processos, agrupando em um ícone do iniciador.
Jacob Vlijm
Oh Isso é uma vergonha. Valeu a pena adicionar o aviso "... parece fazer o truque para mim" no final. É uma função que eu realmente esperava incorporar no sistema operacional e pensei que simplesmente não sabia como fazê-lo. No mínimo, eu esperaria as informações em "Sobre".
22416 el