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で実行されるようにスケジュールされます。 。nohup
nohup
nohup
このコマンドセットにはどのように追加できますか?
答え1
いくつかのオプションがあり、すべて最後にフォアグラウンドセッションを終了する必要がある要件を維持します(利用可能kill $WB
)。
- 可能であればtmux(またはscreen)を使用してください。これはユースケースの最も明確なソリューションです。接続を切断するとtmuxセッションが切断されるため、後で出力を確認したい(代わりに
tail -f nohup.out
)実行するコマンドは停止しません。セッションに再接続します。すべてのコマンドがフォアグラウンドで実行されるため、このトリックは不要なので、単純なkill $WB
コマンドでexit
十分です。一般化する:VPSにssh - >実行tmux
- >リストされているコマンドを入力します(最後にコマンドを入力せずにWB=$$; (
単純なコマンドに置き換えます) - >必要に応じて切断し、切断して再接続します。) &
kill $WB
exit
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 $$ &
ファイルに挿入できない場合、または挿入したくない場合は、次のように実行します
nohup bash -c " ...your commands here... ; kill $$" &
。これは bash 引数で実行される前に置き換えられるため、$$
まだ外部フロントシェルを参照します。-c
スクリプトは2時間の睡眠から始まるので、その手順を検討してください
at
。at now + 2 hours
コマンドを実行してから2時間後に実行するように入力できます(1分単位)。必要なすべてのコマンドを入力したら、Ctrl + Dを使用して "at shell"を終了し、atq
コマンドシーケンスが実行されるようにスケジュールされていることを確認できます。スクリプトを区切り文書として実行することもできます。デフォルトではオプション3と同じですが、コマンドを引数として指定するのではなく、
-c
bashの標準入力に供給します。スクリプトにパラメーターが必要な場合は、次のように bash の呼び出し中にパラメーターを指定する必要があります。nohup bash -s -- firstArgument secondArgument <<'EOF' & ....paste your code here..... EOF