Você tem algumas opções, todas as quais preservam seu requisito de finalizar sua sessão de foreground no final (o que você faz com kill $WB
).
- Se possível, use o tmux (ou tela). É a solução mais óbvia para o seu caso de uso: uma desconexão em sua extremidade causará apenas um desligamento da sessão do tmux, assim os comandos que você emitiu não irão parar; Depois disso, você poderia até mesmo anexar a essa sessão se quisesse verificar sua saída (em vez de
tail -f nohup.out
). Você nem precisaria do truquekill $WB
, já que todos os comandos são executados em primeiro plano, portanto, um simplesexit
será suficiente. Resumo : ssh no seu VPS - > executetmux
- > digite os comandos que você listou (semWB=$$; (
,) &
no final e substituindokill $WB
por um simplesexit
) - > desconecte, desconecte e reconecte conforme necessário -
Se você não puder ou não quiser usar o tmux, coloque seus comandos em um arquivo. O problema aqui é basicamente que
nohup
não pode executar comandos agrupados (o conceito de subshell é exclusivo para bash, você não pode executar um com nohup), então você poderia colocar seu código no arquivo/opt/myscript.sh
:#!/bin/bash #You will pass the PID of the foreground shell as its first argument WB=$1 sleep 2h; echo "Removing PMA and exiting"; phpdismod mcrypt mbstring; apt-get purge phpmyadmin -y; service apache2 restart; sed -i 's/Include \/etc\/phpmyadmin\/apache.conf/ /g' /etc/apache2 /apache2.conf; kill $WB
Então você pode executá-lo com
nohup /opt/myscript.sh $$ &
-
Se você não puder ou não quiser colocá-los em um arquivo, basta executá-los assim:
nohup bash -c " ...your commands here... ; kill $$" &
. O$$
aqui ainda estará se referindo ao shell externo do primeiro plano, já que ele é substituído antes de ser executado como o argumento bash-c
. -
À medida que seu script começa com 2 horas de inatividade, convém considerar o programa
at
. Você pode executarat now + 2 hours
e depois digitar os comandos que deseja executar 2 horas a partir de então (com granularidade de 1 minuto). Depois de ter digitado todos os comandos que você precisa, você pode sair do "at shell" com Ctrl + D e verificar comatq
que sua seqüência de comando foi agendada para execução. -
Você também pode executar seu script como heredoc. É basicamente o mesmo que a opção 3, mas em vez de especificar seus comandos como o argumento
-c
, você os fornece para a entrada padrão do bash. Apenas esteja ciente de que, se o seu script espera argumentos, você deve especificá-los durante a chamada para o bash, desta forma:nohup bash -s -- firstArgument secondArgument <<'EOF' & ....paste your code here..... EOF