Como eu poderia adicionar nohup a um conjunto de comandos bash?

2

Eu tenho o seguinte conjunto de comandos que às vezes eu executo no meu VPS. Basicamente funciona bem; Ele roda em segundo plano e faz o que eu preciso.

WB=$$; (
       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
) &

A única coisa que eu sinto falta:

A única coisa que sinto falta neste conjunto de comandos é um nohup . É importante para mim usar nohup no caso de eu ter fechado a sessão ou ter uma queda de energia no meu final --- Com um nohup , eu prometo que o conjunto de comandos ainda será agendado para execução no VPS, em tais casos.

Como eu poderia adicionar um nohup a este conjunto de comandos?

    
por JohnDoea 29.12.2016 / 14:19

1 resposta

3

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 ).

  1. 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 truque kill $WB , já que todos os comandos são executados em primeiro plano, portanto, um simples exit será suficiente. Resumo : ssh no seu VPS - > execute tmux - > digite os comandos que você listou (sem WB=$$; ( , ) & no final e substituindo kill $WB por um simples exit ) - > desconecte, desconecte e reconecte conforme necessário
  2. 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 $$ &

  3. 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 .

  4. À medida que seu script começa com 2 horas de inatividade, convém considerar o programa at . Você pode executar at 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 com atq que sua seqüência de comando foi agendada para execução.

  5. 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
    
por 29.12.2016 / 16:02

Tags