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 simplesexitserá suficiente. Resumo : ssh no seu VPS - > executetmux- > digite os comandos que você listou (semWB=$$; (,) &no final e substituindokill $WBpor 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
nohupnã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 $WBEntã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 hourse 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 comatqque 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