Estou tentando obter o processID pcmanfm
assim:
pgrep -f "pcmanfm"
Quando pcmanfm
não está rodando, o comando acima não retorna nada (como eu esperava).
No entanto, quando executo o comando do python, ele retorna um ID de processo mesmo quando pcmanfm
não está em execução:
processID = os.system('pgrep -f "pcmanfm"')
Além disso, se você executar o comando acima várias vezes em um prompt python3, ele retornará um processID diferente a cada vez. Todo o tempo, pcmanfm
foi fechado antes desses comandos.
>>> processID = os.system('pgrep -f "pcmanfm"')
17412
>>> processID = os.system('pgrep -f "pcmanfm"')
17414
>>> processID = os.system('pgrep -f "pcmanfm"')
17416
Isso está realmente atrapalhando minha capacidade de iniciar pcmanfm
se não estiver em execução no momento. Meu script pensa que está sendo executado quando não está.
Por que isso está acontecendo?
Na verdade, estou encontrando esse problema em um script Autokey que tentei escrever com base neste vídeo que assisti. Segue meu script atual:
processID = system.exec_command('pgrep -f "pcmanfm" | head -1',True)
dialog.info_dialog("info",processID)
if (processID):
cmd = "wmctrl -lp | grep " + processID + " | awk '{print $1}'"
windowID = system.exec_command(cmd,True)
# dialog.info_dialog("info",windowID)
cmd = "wmctrl -iR " + windowID
#dialog.info_dialog("info",cmd)
system.exec_command(cmd,False)
else:
#os.system("pcmanfm /home/user/Downloads")
cmd = "/usr/bin/pcmanfm /home/user/Downloads"
system.exec_command(cmd,False)
O problema é que continuo recebendo processIDs mesmo quando pcmanfm
não está em execução. O script se concentra adequadamente pcmanfm
se estiver em execução, mas não o iniciará se não estiver.
Atualização: finalmente consegui que esse script funcionasse removendo -f
e substituindo-o por -nx
(do conselho de @they). Além disso, adicionei algum tratamento de exceção para ignorar exceções de chave automática causadas pela saída vazia esperada. Além disso, converti-o em uma função (mais flexível) para que atenda a uma variedade maior de comandos/aplicativos:
import re
def focusOrLaunch(launchCommand):
appName = re.findall('[^\s/]+(?=\s|$)',launchCommand)[0]
processID = None
try:
processID = system.exec_command('pgrep -nx "' + appName + '"',True)
except Exception as e:
#dialog.info_dialog("ERROR",str(e))
pass
#dialog.info_dialog("info",processID)
if (processID):
cmd = "wmctrl -lp | grep " + processID + " | awk '{print $1}'"
windowID = system.exec_command(cmd,True)
# dialog.info_dialog("info",windowID)
cmd = "wmctrl -iR " + windowID
#dialog.info_dialog("info",cmd)
system.exec_command(cmd,False)
else:
system.exec_command(launchCommand,False)
cmd = "/usr/bin/pcmanfm ~/Downloads"
focusOrLaunch(cmd)
Solução proposta:
Remova a
-f
opção do seupgrep
comando.Explicação:
Você provavelmente obtém o ID do processo do shell que é executado para executar seu comando. Um novo processo de shell com um novo PID será criado para cada arquivo
system.exec_command
.Execute, por exemplo
sh -c 'pgrep -af nonexistent'
, e verifique a saída. Você provavelmente obterá algo comoCom um comando existente, também recebo uma linha para o shell
Dependendo dos valores de PID, seu
head
comando pode extrair o PID de um processo que você está procurando ou o PID do processo de shell.Com a opção,
-f
você diz explicitamentepgrep
para pesquisar toda a linha de comando em vez de apenas o nome do processo. Dessa forma, ele encontrará a string no argumento de linha de comando do shell.Sem
-f
você não terá o processo de shell.Aqui está minha opinião sobre como focar a janela de um programa se estiver em execução ou iniciar o programa se não estiver. Eu usei o Firefox no exemplo, mas espero que funcione da mesma maneira para o seu pcmanfm se você fizer as edições apropriadas para remover o Firefox do código de exemplo e substituí-lo pelas informações PCManFM equivalentes .
Observe que eu usei a função subprocess.Popen porque ela permite que você execute outro código e/ou interaja com o processo com a função subprocess.communicate enquanto o processo está em execução. Se isso não for necessário, você pode usar a função subprocess.run .