Como uma medida preventiva para a inconveniência de ter que pressionar CTRL - z , você poderia fazer um script wrapper para o seu editor ao qual executaria seu editor em segundo plano . Dessa forma, você não precisaria se preocupar em lembrar de iniciá-lo explicitamente no plano de fundo:
#!/bin/sh
EDITOR="emacs" # or whatever
if [ -z "${DISPLAY}" ]; then
${EDITOR} "$@"
else
${EDITOR} "$@" &
fi
Acima nós primeiro tentamos determinar se você tem o servidor X disponível e só então rodamos o editor em segundo plano (se não, muitos editores Unix irão usar o seu terminal e você não quer rodar o editor como um processo em segundo plano este caso). Ele irá passar todos os argumentos para o seu editor de escolha na íntegra ( "$@"
) exatamente como você forneceu para o script wrapper.
Quanto ao comando que está faltando ... De acordo com minha experimentação básica, para programas GUI que não envolvam terminal, pode ser tão simples quanto enviar primeiro SIGSTOP
e, em seguida, SIGCONT
ao processo de primeiro plano (usando kill
comando se você usar o shell script para implementar isso). É claro que você precisaria executá-lo em outra janela / guia de terminal, e a dificuldade seria encontrar de forma conveniente e genérica o PID para o qual deseja enviar seu sinal. Você poderia, por padrão, enviar os dois sinais para todos os processos do nome dado (padronizando para o seu editor favorito e permitindo também usar os PIDs como argumentos):
#!/bin/sh
EDITOR=emacs # whatever
stop_cont_prog()
{
case "$1" in
# begin with number is considered PID - this is not good
# enough to be taken seriously...
[1-9]*) kill -SIGSTOP "$1"; kill -SIGCONT "$2";;
*) killall -SIGSTOP "$1"; killall -SIGCONT "$2";;
esac
}
if [ -n "$1" ]; then
for prog in "$@"; do stop_cont_prog "$1"; done
else
stop_cont_prog "${EDITOR}"
fi
Este método me deu corretamente minhas guias de terminal depois de executar (vários) emacs
comandos em segundo plano. Mas o processo do emacs em execução no terminal não foi restaurado corretamente devido ao controle do trabalho do shell ou à confusão na configuração do terminal. Então, esse método se beneficiaria de alguma sofisticação.
O SIGSTOP
é exatamente o que é enviado para o processo em primeiro plano quando você pressiona (por padrões comuns) CTRL - z . Consulte stty -a
output
$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]
(saída abreviada) e stty
página de manual:
susp CHAR
CHAR will send a terminal stop signal
Os processos parados usando o sinal SIGSTOP
podem ser reiniciados enviando SIGCONT
. Normalmente, é a lógica de controle da tarefa do shell que enviará o SIGCONT
e cuidará de outras manipulações necessárias envolvidas com os comandos fg
e bg
que ignoramos.