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!
ps
exprop
?.desktop
arquivo, que não é necessariamente o WM_CLASS. O WM_CLASS pode ser definido de dentro do aplicativo.firefox.desktop
, ele lança o Firefox com PID 1234, mas mudouWM_CLASS
para algo como 'Totally Not Firefox'. O.desktop
arquivo, no entanto, não muda. Você deseja que o nome seja anexado ao PID 1234, independentemente deWM_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?Respostas:
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>/stat
e/proc/<pid>/cmdline
é uma maneira razoavelmente geral, mas ainda não pega todos os casos. Opgrep
comando envolve isso. Se você ainda não estiver usandopgrep
, 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 ?
fonte
O
xprop
comando (seguido de alt-tab na janela do aplicativo relevante e, em seguida, clique uma vez na janela) parece fazer o truque para mim.fonte
WM_CLASS
geralmente corresponde ao nome do processo, mas definitivamente nem sempre. Definindo (codificando) uma janela, posso dar oWM_CLASS
que quiser. Até fiz isso sozinho para criar janelas, executando diferentes processos, agrupando em um ícone do iniciador.