bashコマンドセットにnohupを追加するにはどうすればよいですか?

bashコマンドセットにnohupを追加するにはどうすればよいですか?

VPSで時々実行される次のコマンドセットがあります。基本的にはうまくいきます。バックグラウンドで実行され、必要なタスクを実行します。

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

私が欠場する唯一のことは次のとおりです。

このコマンドセットで私が逃した唯一のことは、セッションを閉じるか電源を切るときにnohup私にとって重要です。 ---を使用すると、この場合、命令セットはVPSで実行されるようにスケジュールされます。 。nohupnohup

nohupこのコマンドセットにはどのように追加できますか?

ベストアンサー1

いくつかのオプションがあり、すべて最後にフォアグラウンドセッションを終了する必要がある要件を維持します(利用可能kill $WB)。

  1. 可能であればtmux(またはscreen)を使用してください。これはユースケースの最も明確なソリューションです。接続を切断するとtmuxセッションが切断されるため、後で出力を確認したい(代わりにtail -f nohup.out)実行するコマンドは停止しません。セッションに再接続します。すべてのコマンドがフォアグラウンドで実行されるため、このトリックは不要なので、単純なkill $WBコマンドでexit十分です。一般化する:VPSにssh - >実行tmux- >リストされているコマンドを入力します(最後にコマンドを入力せずにWB=$$; (単純なコマンドに置き換えます) - >必要に応じて切断し、切断して再接続します。) &kill $WBexit
  2. tmuxが利用できない場合や使用したくない場合は、コマンドをファイルに入れます。ここでの問題は、基本的にグループnohup化されたコマンドを実行できないことです(サブシェルの概念はbashに固有であり、nohupでは実行できません)。したがって、コードをファイルに入れることができます/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
    

    それから実行してくださいnohup /opt/myscript.sh $$ &

  3. ファイルに挿入できない場合、または挿入したくない場合は、次のように実行しますnohup bash -c " ...your commands here... ; kill $$" &。これは bash 引数で実行される前に置き換えられるため、$$まだ外部フロントシェルを参照します。-c

  4. スクリプトは2時間の睡眠から始まるので、その手順を検討してくださいatat now + 2 hoursコマンドを実行してから2時間後に実行するように入力できます(1分単位)。必要なすべてのコマンドを入力したら、Ctrl + Dを使用して "at shell"を終了し、atqコマンドシーケンスが実行されるようにスケジュールされていることを確認できます。

  5. スクリプトを区切り文書として実行することもできます。デフォルトではオプション3と同じですが、コマンドを引数として指定するのではなく、-cbashの標準入力に供給します。スクリプトにパラメーターが必要な場合は、次のように bash の呼び出し中にパラメーターを指定する必要があります。

    nohup bash -s -- firstArgument secondArgument <<'EOF' &
    ....paste your code here.....
    EOF
    

おすすめ記事