Bashで時間単位でタイムアウトする方法(セッションが閉じてもタイムアウトを維持する方法)は何ですか?

Bashで時間単位でタイムアウトする方法(セッションが閉じてもタイムアウトを維持する方法)は何ですか?

Ubuntu 16.04にPHPmyadminをインストールしてから削除するために、次のスクリプトを作成しました...

私の目標は、PHPmyadminを使用するたびにこのスクリプトを使用し、一定時間が経つにつれて使用することです。2時間、削除してください。これインストール - 使用 - 削除この方法はセキュリティ上の理由で使用されます(MySQLにできるだけアクセスできないようにし、短時間の間ローカルでのみアクセス可能)。

bash /dev/fd/15 15<< 'EOF0'    

#!/bin/bash -x

# Install commands:

sudo apt-get install phpmyadmin
sudo phpenmod mcrypt
sudo phpenmod mbstring
cat << EOF1 >> /etc/apache2/apache2.conf

Include /etc/phpmyadmin/apache.conf
EOF1
sudo service apache2 restart

# Unnstall commands:

sleep 2h    
sudo phpdismod mcrypt mbstring
sudo apt-get purge phpmyadmin
sudo service apache2 restart
sed -i 's/Include \/etc\/phpmyadmin\/apache.conf/ /g /etc/apache2/apache2.conf

EOF0

Jeffがコメントで指摘したように(そしてコード例を編集するときに)コマンドを使用することはできますが、sleep古典sleep的な形式ではセッションが開いている必要があり、何らかの理由でウィンドウが時々閉じることがあります。 a 正式な回答では、この 2 時間の間一時停止する方法を示す必要があります。ただし、誤って/意図的にウィンドウを閉じたり、何らかの理由でコンピュータが再起動したり、停電が発生した場合でも、---一時停止した場合、そのコマンド以降のすべての操作は内側の干渉なしにVPSで実行され続けます。

それでは、インストールコマンドを実行してから2時間後にセッションに依存しない方法でアンインストールコマンドをどのように実行できますか?

答え1

これを達成するためにこのユーティリティを使用できますat

単一コマンドの場合は、次のようにします。

at 'now + 2 hours' -f /path/to/uninstall.sh

複数のコマンドの場合は、次のようにスクリプトをシェルに供給します。cat heredocument:

cat << EOF | at 'now + 2 hours'
command1
command2
........
EOF

あるいは、systemdソリューションを介してこれを達成することもできます(インストールした場合も同様です)。

systemd-run --on-active=2h -- /bin/bash /path/to/uninstall.sh

答え2

ご覧sudoのとおり、アクセス権があり、サービスを開始できます。したがって、atdサービスとatコマンドを使用してタスクをスケジュールできます。

echo 'touch $HOME/`date -j +%s`.txt' | at + 2 minutes

複数のコマンドには2つのオプションがあります。

  1. 結合されたechoコマンド:

    (echo "command1"
     echo "command2"
     echo "command3" ) | at + 2 hours
    
  2. 一時ファイルをコマンドのリストとして使用します。

     tmp_file=$(mktemp --tmpdir uninstall_commands.XXXX)
     echo "command1" >> ${tmp_file}
     echo "command2" >> ${tmp_file}
     echo "command3" >> ${tmp_file}
     at -f ${tmp_file} + 2 hours
     rm -f -- ${tmp_file}
    

答え3

2つのスクリプトがあるとします(何かをしましょう。):

install.sh

#!/bin/sh -eu
sudo apt-get install phpmyadmin
sudo phpenmod mcrypt mbstring
printf 'Include /etc/phpmyadmin/apache.conf' >> /etc/apache2/apache2.conf
sudo service apache2 restart

uninstall.sh

#!/bin/sh -eu
sudo phpdismod mcrypt mbstring
sudo apt-get purge phpmyadmin
sudo service apache2 restart
sed -i 's/Include \/etc\/phpmyadmin\/apache.conf/ /g /etc/apache2/apache2.conf

私が考えることができる最も簡単な答えはまさにあなたが望むものです

./install.sh && sleep 2h && ./uninstall.sh >>/var/log/mylog.log 2>&1

各スクリプトには、サーバーに接続するためのsshコマンドも含まれています。このアプローチはサーバーの電源周期には弾力的ですが、エンドポイントには弾力的ではありません。

代わりに単純化しましょう。この回答主にatdが出力を配置する奇妙な動作のために、代わりに以下を使用してください。

nohup sleep 2h && ./uninstall.sh >>/var/log/mylog.log 2>&1 &

いったん実行すると、所望のタスクを実行するのに約2時間かかり、時間が経過すると削除プロセスが実行されます。このアプローチは、サーバーの電源循環を受け入れません。

この回答は依存関係を防ぎ、関連する出力を慎重にキャプチャして記録し、診断/デバッグを可能にします。

答え4

このソリューションがあなたの要件を満たすかどうかはわかりませんが、試してみることはできます。

今すぐPCのシャットダウン/再起動を忘れた場合は、ターミナルをキャプチャせずにbashで次のコマンドを実行できます(テスト用に1行のコマンドで試すことができます)。

sleep 10 && yad --text="10 seconds passed" && exit &

上記のコマンドは予期しませんでしたが、ターミナルウィンドウを閉じても機能します。

PS:これをnohupと組み合わせると、ログアウトしてもコマンドは実行され続けます。

回避策として、初期スクリプトを次のようにインストール用スクリプトとアンインストール用スクリプトの2つに分割できます。

#script_to_install.sh  
sudo apt-get install phpmyadmin
sudo phpenmod mcrypt mbstring
printf 'Include /etc/phpmyadmin/apache.conf' >> /etc/apache2/apache2.conf
sudo service apache2 restart
sleep 7200 && path/to/script_to_remove.sh &
exit #exit the first script to free terminal (or even close the terminal)
#end of script_to_install.sh

#script_to_remove.sh
#Optionally you can use xterm -e (or similar) to bring up a terminal window automatically to see the output of the commands
sudo phpdismod mcrypt mbstring
sudo apt-get purge phpmyadmin
sudo service apache2 restart
sed -i 's/Include \/etc\/phpmyadmin\/apache.conf/ /g /etc/apache2/apache2.conf
exit
#end of script_to_remove.sh

PCの再起動部分に戻り、起動時間を一時ログファイルに書き込むと、この問題を解決できると思います。再起動すると、その一時ファイルを監視して(たとえば、inotifyツールを使用して)経過時間を確認できます(テストされていません)。

関連情報