Tente usar um menor sinal de morte para o programa, como 3 (SIGQUIT).
Eu uso o Ubuntu 10.10, e eu tenho um programa em Python ( Mnemosyne ) que sincronizo os dados arquivos usando o Dropbox . Aqui está o meu cenário de problema. Deixo o programa rodando em casa e vou trabalhar, mas se eu abrir o programa no trabalho e trabalhar nele, o arquivo de dados é alterado e perco meu progresso em casa quando saio (ele salva automaticamente) ao sair.
Eu pensei em criar um cron job para fechar automaticamente o Mnemosyne todas as manhãs, independentemente de eu lembrar de fazer isso ou não, mas se eu usar kill o programa sai sem salvar o arquivo de dados, e acabo com um arquivo tmp e uma mensagem de erro quando eu reinicio. Existe uma maneira melhor de enviar o sinal de saída para este programa emulando-me clicando em arquivo > opção de menu de saída.
Tente usar um menor sinal de morte para o programa, como 3 (SIGQUIT).
Por sua descrição, eu assumo que este é um programa gráfico rodando em um servidor X. Tente wmctrl :
wmctrl -c "RegEx for Window Name"
Na página do manual:
-c <WIN> Close the window <WIN> gracefully.
Que tal iniciar o programa em uma sessão de tela em casa para que você possa se reconectar a ele no trabalho e ter controle total do que está acontecendo?
Há páginas de manual no mnemosyne? Talvez haja um comando de fechamento nos documentos que você poderia usar em seu cron job.
A resposta correta para isso depende do que o seu programa suporta. Um programa bem comportado deve salvar todo o trabalho e finalizar normalmente ao receber o sinal TERM, que é o padrão em kill, então presumo que seja esse o que você estava tentando. Se o programa não tolerar isso e não oferecer outra forma, por exemplo, sobre uma tomada de controle, você pode estar sem sorte. Nesse caso, tente usar uma sessão de tela ou corrija o programa ou use um diferente.
Isso é altamente dependente de aplicativos. Se os autores do mnemosyne não previram esse tipo de situação e especificamente criaram um comportamento "salvar e desistir ao receber o sinal X", então você está praticamente preso a ter que manipular sua interface de usuário para realizar isso.
No entanto, como já sugerido, a melhor solução seria executar o mnemosyne sob alguma forma de utilitário de compartilhamento de exibição para que você possa acessar a mesma sessão de ambos os locais em vez de desligá-lo e reiniciá-lo sempre que for realocado. VNC é a opção de compartilhamento de área de trabalho da GUI com a qual eu estou mais familiarizado, mas provavelmente há uma maneira de fazer com que o X faça isso no nível do aplicativo (em vez de em toda a área de trabalho) e há muitas outras opções que pode funcionar melhor para você.
Se fosse um aplicativo de linha de comando, screen
funciona maravilhosamente (eu o uso diariamente apenas para esse fim, dando acesso a uma única instância de mutt
de vários locais), mas não acho lida com aplicativos GUI (a página man não parece fazer referência a "GUI" ou "X").
Como regra geral, a única maneira de fechar um programa é um sinal. Como outros já disseram, se ele não estiver respondendo bem ao kill padrão (que envia SIGTERM), provavelmente não terá o manipulador adequado para outros sinais. Não há sinal de 'gentil mais gentil'. Todos os sinais diferentes do SIGKILL tratam o processo da mesma forma, executando o manipulador se ele tiver um, ou matando o aplicativo.
Dito isso, como um aplicativo de gui, há uma chance muito pequena de vincular a uma biblioteca que você pode controlar o aplicativo. Você pode tentar ver se você pode enviar mensagens com dcop ou d-bus. Consulte o link
Tags unix