見出し画像

【Win/Mac】io.netの再起動コマンドの自動実行処理

このコマンドの処理内容と目的

このコマンドの処理内容は1日ごとに強制的にio.netのノード再起動を行うものになります。ステータスを確認せずに強制的に処理が走るのでHireになっていても再起動がかかります。

この記事は2024年4月上旬時点のio. netの状況に合わせたコマンドになっています。公開APIの情報が公開されておらず、workerの稼働ステータスがAPI取得できない状況下のものです。Hireになっている端末を落としてしまうリスクよりも、長時間チェックできないことによりidle時間が少なくなるリスクを軽減するものとなります。

また、この記事はすべてのリテラシーの方を対象としたものではなく、ある程度コードが触れる(触っていく気概のある)方を対象としています。そのため、テキストエディタの利用方法などについての解説はありません。

また記事のスクリプトを利用することは全て自己責任で行なってください。

追記(2024年4月24日)

4/24のAMAでIOのステーキングの仕組みやスラッシングの仕組みに関して、おおよそ2−3ヶ月はかかるだろうという情報でしたので7月くらいまでは定期実行のコマンドは有効と思われます。windows updateによる再ログイン処理はどのみちノード切断されるので上記仕組みが実装されても稼働で良いと思います。

追記(2024年4月26日)

workerの立ち上げ方が大幅にバージョンアップされたので、現在この記事内容ではworkerの再起動はできません。記事内容更新をお待ちください。

自動化したい流れ

  1. dockerコンテナの停止と削除
    dockerの再起動のために動いているコンテナの停止と削除をします。また動いているコンテナがあるとdockerイメージの削除ができません。

  2. dockerイメージを削除する
    削除しなくても動くのですが頻繁にイメージの更新もあり、実際Hireになった時に容量を圧迫してはいけないため毎回削除が良いと思います。

  3. 起動コマンドを実行する
    デバイスIDを変えて新規登録しない限り、一番最初に使ったコマンドを再利用できます。

上記の処理を定期実行のタスクスケジューラー等で実行していきます。

※本来であればworkerのステータスをAPIで取得して、赤マーク(Failやinactiveなど)のステータスの時のみ処理を実行するのが理想です。

Windowsの場合

windowsの場合はPowershellを使う前提で書いていきます。

Powershellスクリプトファイルの実行権限の確認と設定

まずPowershellのスクリプトファイルの実行権限があるか確認します。通常Windowsの初期設定では無効になっています。(ウイルスなどに悪意のあるスクリプトを実行させないため)

Powershellを管理者権限で立ち上げてPowershellで以下コマンドを実行してください。

get-executionpolicy

これでRestrictedが返ってきたらがPowershellスクリプトファイルの実行権限が無効な状態です。その場合は以下コマンドで有効に変更します。(管理者権限でPowershell立ち上げている必要があります。)

set-executionpolicy remotesigned

これで再度get-executionpolicyを実行し、RemoteSignedが返ってきたら設定完了です。

スクリプト実行ファイルの作成

Powershellのスクリプト実行ファイルの拡張子は.ps1となります。名前は何でもいいのですが、ここではio-docker.ps1とします。

作成する場所は、いつもio.netの再起動コマンドを打っている場所で良いでしょう。

File name : io-docker.ps1

$dockerProcess = Get-Process "Docker Desktop" -ErrorAction SilentlyContinue

if ($null -eq $dockerProcess) {
    Start-Process "C:\Program Files\Docker\Docker\Docker Desktop.exe"
    Write-Output "Starting Docker Desktop..."

    # Docker Desktopが完全に起動するまで待機
    do {
        Start-Sleep -Seconds 10
        $dockerStatus = docker info 2>&1
    } while ($dockerStatus -like "*Is the docker daemon running?*")
} else {
    Write-Output  "Docker Desktop is already running."
}

# 全てのDockerコンテナを停止し、削除する
docker stop $(docker ps -q)
docker rm $(docker ps -q -a)

# 全てのDockerイメージを削除する
docker rmi $(docker images -q)

# 新しいDockerコンテナを起動する
docker run -d -v /var/run/docker.sock:/var/run/docker.sock -e DEVICE_NAME="⚫︎⚫︎⚫︎⚫︎" -e DEVICE_ID=⚫︎⚫︎⚫︎⚫︎ -e USER_ID=⚫︎⚫︎⚫︎⚫︎ -e OPERATING_SYSTEM="Windows" -e USEGPUS=true --pull always ionetcontainers/io-launch:v0.1

Write-Output "Script execution completed."

※DEVICE_NAME 、DEVICE_ID、USER_ID部分はご自身の起動コマンドのものを入力してください。

最後の起動スクリプトは念の為、ご自身のダッシュボードのスクリプトをそのままペーストすることをお勧めします。

手動で実行したい場合

手動で実行したい場合は、このio-docker.ps1ファイルを手動で実行すれば再起動がかかります。

io-docker.ps1の保存している階層でPowershellで以下コマンドを実行するだけです。

.\io-docker.ps1

自動で定期実行したい場合

windowsの場合、タスクスケジューラーを使うのが一般的です。タスクスケジューラーの最短の期間が1日間隔なので、それよりも間隔を短くしたい場合はタスクスケジューラ以外の方法を頑張って調べてみてください。

1.タスク スケジューラーの開始: スタートメニューから「タスク スケジューラー」を検索して開きます。

2.基本タスクの作成: 「操作」パネルから「基本タスクの作成」を選択します。

3.タスクの名前と説明の設定: タスクに名前と(オプションで)説明を付けます。

4.トリガーの設定: タスクを実行する頻度(毎日、毎週、毎月など)を設定します。ここは毎日の設定で良いと思います。

5.操作の設定: 「プログラムの開始」を選択し、「プログラム/スクリプト」の欄に powershell を入力します。引数の欄に -ExecutionPolicy Bypass C:¥Users¥soh¥io-docker.ps1のようにスクリプトのフルパスを入力します

-ExecutionPolicy Bypass CUsers¥soh¥io-docker.ps1

↑上記は自分のフルパスを入力してください。-ExecutionPolicy Bypass C:¥Users¥⚫︎⚫︎¥io-docker.ps1 おそらく⚫︎⚫︎部分をご自身の環境の名前に変える必要あります。Userのホームディレクトリ以外にファイルを置いている人はホームディレクトリに持ってくるか、ファイルを置いている場所をpdwコマンドなどで調べてください。

※フルパスが正しく入力できていないことで動かないケースがあります。この記事のコピペでダメだった場合はスペースが入ってないか、¥が大文字になっていないか確認して、最後は手打ちも試すことをお勧めします。

6.タスクの保存: 設定が完了したら、タスクを保存します。

タスクのテスト:タスクを保存した後、タスク スケジューラーでタスクを見つけ、「右クリック」→「実行」を選択して、スクリプトが想定通りに実行されるかテストします。

実行を押して、PowerShellが立ち上がり一連の処理が行われたら設定完了です。

WindowsUpdateで強制再起動された時の対応

上記のアレンジになりますが、WindowsUpdate後にWindowsにログインしたときをトリガーとしてノードの再起動を行う設定をします。またWindowsの自動ログイン設定が必要となります。

1.ユーザーの自動ログイン設定

  • Win + R キーを押して「実行」ダイアログを開き、netplwiz を入力して実行します。

  • 上記のコマンドでユーザーアカウントのウィンドウが開きます。ここで、ログインしたいユーザーアカウントを選択し、「ユーザー名とパスワードを入力してこのコンピューターを使用する」のチェックを外します。

もし以下のようにチェックボックスが出ない場合は別の設定が必要となります。

アカウントからサインインオプションを選んで、「セキュリティの向上のため、このデバイスではMicrosoftアカウント用にWindows Helloサインインのみを許可する(推奨)」をオフにするとチェックボックスが出てきます。

  • 適用をクリックすると、ユーザー名とパスワードを求められるので、自動ログインさせたいアカウントの情報を入力します。

以上でWindowsの自動ログインの処理が終わりました。

2. タスクスケジューラを使用したスクリプトの自動実行

これは定期実行とほぼ同じなのですが、トリガーをログオン時に変更します。

それ以外は定期実行と同じタスクを作ればOKです!タスクは定期実行用とWindowsUpdate後のログオン用の2つある状態です。

Macの場合

基本はwindowsと同じですが、シェルスクリプトファイルで作成します。

スクリプト実行ファイルの作成

macで使うシェルスクリプトの拡張子は.sh。名前は何でもいいのですが、ここではio-docker.shとします。

作成する場所は、いつもio.netの再起動コマンドを打っている場所で良いでしょう。

File name : io-docker.sh

# 全てのDockerコンテナを停止し、削除する
docker stop $(docker ps -q)
docker rm $(docker ps -q -a)

# 全てのDockerイメージを削除する
docker rmi $(docker images -q)

# 新しいDockerコンテナを起動する
./launch_binary_mac --device_id=⚫︎⚫︎⚫︎⚫︎ --user_id=⚫︎⚫︎⚫︎⚫︎ --operating_system="macOS" --usegpus=false --device_name=⚫︎⚫︎⚫︎⚫︎

※DEVICE_NAME 、DEVICE_ID、USER_ID部分はご自身の起動コマンドのものを入力してください。

最後の起動スクリプトは念の為、ご自身のダッシュボードのスクリプトをそのままペーストすることをお勧めします。

実行権限の付与

ターミナルを開き、スクリプトファイルが保存されているディレクトリに移動します。次に、スクリプトに実行権限を付与します。

chmod +x io-docker.sh

手動で実行したい場合

手動で実行したい場合は、このio-docker.shファイルを手動で実行すれば再起動がかかります。

io-docker.shの保存している階層でターミナルで以下コマンドを実行するだけです。

./io-docker.sh

自動で定期実行したい場合

macだとcronが定番ですが、コマンドラインで設定が必要なため、今回はAutomatorとカレンダーアプリの連携を紹介します。こちらも最短の期間が毎日なので、それよりも短い間隔で再起動したい場合はcronを調べてチャレンジしてみてください。

Automatorでの作業

1.Automatorアプリケーションを開く: Finderからアプリケーション > Automatorを選択します。

2.新しいドキュメントを作成: 開いたウィンドウで「新規作成」をクリックします。

3.カレンダーアラームを選択: カレンダーアラームを選択して、「選択」をクリックします。

4.アクションを追加: 左側のアクションリストから必要なアクションをドラッグ&ドロップでワークフローエリアに追加します。シェルスクリプトを実行したい場合は、「ユーティリティ」カテゴリーの中の「シェルスクリプトを実行」を選択し、右側のウィンドウにスクリプトを入力します。

スクリプトは先ほど作成したものを直接貼り付けても良いですし、io-docker.shファイルを実行するコマンドの実行でもOKです。Userのホームディレクトリ以外にファイルをスクリプトファイルを置いている方はUser直下に持ってくるか、スクリプトファイルの内容を直接書き込んでください。

右上の実行ボタンを押して、正しく動くか確認してください。

ログ部分に緑のチェックマークがついて、Dockerコンテナが新しく作られていることが確認できればOKです。

注意点としては、処理の一番上に以下の追加が必要です。(Automatorから実行する時はどこの場所で実行するのかを明示してあげる必要があるため。)

export PATH="/usr/local/bin:$PATH"

スクリプトファイルを直接全部書き込む場合

export PATH="/usr/local/bin:$PATH"

# 全てのDockerコンテナを停止し、削除する
docker stop $(docker ps -q)
docker rm $(docker ps -q -a)

# 全てのDockerイメージを削除する
docker rmi $(docker images -q)

# 新しいDockerコンテナを起動する
./launch_binary_mac --device_id=⚫︎⚫︎⚫︎⚫︎ --user_id=⚫︎⚫︎⚫︎⚫︎ --operating_system="macOS" --usegpus=false --device_name=⚫︎⚫︎⚫︎⚫︎

※DEVICE_NAME 、DEVICE_ID、USER_ID部分はご自身の起動コマンドのものを入力してください。

最後の起動スクリプトは念の為、ご自身のダッシュボードのスクリプトをそのままペーストすることをお勧めします。

スクリプトファイルの実行処理を書き込む場合

export PATH="/usr/local/bin:$PATH"
./io-docker.sh

5.保存: ファイルメニューから「保存」を選択し、アラームに名前を付けて保存します。これにより、Automatorアクションがカレンダーに追加されます。

6.カレンダーアプリを開く: カレンダーアプリを開きます。
カレンダーアラームを名前をつけて保存すると自動的にカレンダーアプリが開きます。

7.イベントの作成: Automatorで作成したアラームが保存されたカレンダーを選択し、新しいイベントを作成します。このイベントは、Automatorアクションをトリガーするために使用されます。先ほど登録したアラート名を入力すると選択できるようになります。

アラートを設定: イベントの編集画面で、アラートを選択し、先ほどAutomatorで作成したアラームを選択します。

繰り返しを設定: イベントの繰り返しオプションを使用して、タスクを定期的に実行する間隔を設定します。

Linuxの場合

Linuxでノードを立ててるあなたは自分でできる!頑張って


この記事が気に入ったらサポートをしてみませんか?