数日間実行する必要があり、時には失敗する(エラーで終了する)スクリプト(作成せず、変更できません)があります。
この場合、私がすべきことは再起動サーバー(現在より良いソリューションはありません)と再起動スクリプト。現在私はそうします:
SSH経由でログイン
screen -S job
./myscript.sh
タスクを開始します(このスクリプトには次のものしか含まれておらず、dothis
プロセスがエラーで終了する可能性があるとします)。CTRL A、D画面から分離
...数時間待ってください...
ログイン後、回復画面を使用してください
screen -r job
。まだ実行している場合は、切断して後でもう一度戻ってください。
スクリプトが失敗した場合は、sudo reboot
手順1から始めて時間がかかる作業を続行できます。
人の介入なしにどのようにこれを行うことができますか?
スクリプトにエラーがある場合は、それを自動化し、サーバーを自動的に再起動してスクリプトを再起動させるにはどうすればよいですか?
答え1
まず、スクリプトをコンテナに入れてみましょう。これにより、ホスト自体から一部の依存関係が削除され、自動的に再起動できます。
dockerとdocker-composeを使用したソリューション
この方法では docker と docker compose が必要です。 Ubuntuがある場合sudo apt install docker.io docker-compose
。
- Dockerfileを作成してコンテナを構築します。たとえば、次のようになります。
FROM ubuntu
COPY /path/to/script/on/host /myscript.sh
# maybe deal with some dependencies here
CMD /bin/bash /myscript.sh
上記の名前のフォルダをDockerfile
任意のフォルダに保存します。以下では、いくつかの文書を見ることができます。https://docs.docker.com/engine/reference/builder/
- docker-compose.ymlの生成
version: "3.9"
services:
scriptrunner:
build: .
restart: always
それdocker-compose.yml
を入れる同じディレクトリDockerfileを使って。ここでいくつかのドキュメントを参照してください。https://docs.docker.com/compose/compose-file/compose-file-v3/
スクリプトからいくつかの出力を取得したいとします。この場合、ホストとコンテナ間でフォルダを「共有」するためにドッカーボリュームを設定する必要があるかもしれません。
- 端末のフォルダに移動してを入力します
docker-compose up -d
。
この方法では、スクリプトをコンテナに入れ、各スクリプトが失敗した後にコンテナを再起動すると、デーモンとして実行されます。
systemdを使用したソリューション
コンテナを扱いたくない場合は、スクリプトを別のコンテナにラップできますmy-runner.sh
。
#!/bin/bash
/path/to/my-script.sh || systemctl reboot
スクリプトが失敗した後、コンピュータが再起動されます。再起動するには、他のコマンドまたはルート権限が必要な場合があります。
それでは、実行スクリプト用のシステムサービスを作成しましょう。これ素晴らしいチュートリアルですが、次のようにまとめられています。
systemd 単位ファイルを作成し、/etc/systemd/system/my-script.service
次の内容を入力します。
[Unit]
Description=my script runner service
After=network.target
Type=simple
User=my-user
ExecStart=/path/to/the/previous/my-runner.sh
[Install]
WantedBy=multi-user.target
これでコマンドを実行しsystemcl start my-script && systemctl enable my-script
て起動し、再起動後に起動できるようになります。