キムチのきもち

キムチのきもちになって考えてみよう

ChromebookをLinux鯖にして自動化タスクをやらせる(cronでnpm runする例)

自宅Linux鯖と化したChromebook
自宅Linux鯖と化したChromebook

この記事の要約

  • 自宅の余ってたChromebookをLinux鯖として使いだした
  • ChromebookのLinux(Debian)ターミナルにいくつか設定をした
  • フタを閉じても鯖が動くように設定した
  • cronの設定にちょっとコツが要る(npm runをcronで動かすための設定)
  • あんまりよくないけど、ひとまずGitHubリポジトリに、ログをpushさせるようにした

背景

  • 数年前に買ったChromebookがタンスの奥で眠っていた
  • 週次で手動で回してる定型タスク(スクリプト化済)があった
  • いい加減自動化しようと思い、実行環境を調べた
  • ChromebookをLinux鯖として使うのがコスパが最も良かった

メリット

  • ちょっとだけLinuxの勉強になる
  • 個人的な自動化タスクであれば十分
  • 数年スパンで見ると、レンタルサーバー借りるより断然安く、自由度も高い

やりたいこと

  • 毎週1回手動で走らせてるスクレイピングタスクを自動化したい
  • 安く済ませたい
  • 実行後のログは別PCから見れるようにしたい

やったこと

  • ChromebookをLinux鯖化
    • スペック
      • CPU: MediaTek Kompanio 500(スレッド数 8、1.989 GHz)
      • メモリ: 4.00 GB
      • ストレージ: 32GB

※安物のChromebookで十分です。

  • cronタスクを追加
  • cronがnpmコマンドを呼び出せるように調整
  • (あんまりよくないけど)GitHubにログをpush
  • 蓋を閉じてもスリープしないように設定

準備するもの

  • Chromebook(数万で手に入る安物でいい)
  • 自動化したいタスクのスクリプトが入ったGitHubリポジトリ

手順

ChromebookでLinux環境をオンにする

以下の公式の手順に沿って、Linuxを使えるようにしましょう。

support.google.com

デフォルトだと Debian が使えるようになります。

Chromebookの性能は基本的に低スペックですが、Linux自体軽いのでモッサリすることは基本的に無かったです。

ここから先は基本的にCLIなので、黒い画面と仲良くなりましょう。

Linuxターミナルのショートカット設定をする

Linuxターミナルを入れたばかりだと、ターミナル上でショートカットがまだ使えません。

また、USキーボードを使用してる場合、日本語入力切り替えが効かず不便です。

画面下のタスクバーのLinuxターミナルのアイコンを右クリック>設定>キーボードとマウス と開き、

キーボード にある項目を全部オンにしましょう。

これで日本語切り替えや、Ctrl+C、Ctrl+Vでのコピペが楽になります。

※スクショ付きの解説は下記の記事が参考になります。

bbfansite.com

必要なツールのインストール

cronのインストール

ChromebookのデフォルトのLinux環境(Debian)には、最初から cron が入っていません。

cronはタクの定期実行のために必須なのでインストールしましょう。

sudo apt update
sudo apt install cron

cronを動かすにはcronが起動されている必要があります。

起動状態を確認しましょう。

sudo systemctl status cron

起動されてなかったら起動コマンドを叩きましょう。

sudo systemctl start cron

また、Linuxを立ち上げたときにcronが立ち上がるようにしておくと、毎回startしなくてよくなります。

sudo systemctl enable cron

systemctlコマンドの仕様は下記を参考。

wiki.debian.org

systemdについてもっとガッツリ知りたくなったら下記の書籍。

必要なパッケージ・ライブラリのインストール

※ここでインストールするものは、自分のリポジトリ依存です。

※各自で自分のタスク実行に必要なものを適宜インストールしてください。

私の場合は、Node.jsの実行環境(nvm)とGitHubCLI(gh)をインストールしました。

自分のリポジトリなどから自分が自動化したいタスクのソースコードをクローンして、

それらを実行できる環境をChromebookのLinux上に整えましょう。

nvm のインストール

github.com

上記のREADMEに書かれた手順に従って、

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

を実行。

GitHubCLIのインストール

github.com

上記リンクに書かれた下記スクリプトを実行

(type -p wget >/dev/null || (sudo apt update && sudo apt install wget -y)) \
    && sudo mkdir -p -m 755 /etc/apt/keyrings \
    && out=$(mktemp) && wget -nv -O$out https://cli.github.com/packages/githubcli-archive-keyring.gpg \
    && cat $out | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null \
    && sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \
    && sudo mkdir -p -m 755 /etc/apt/sources.list.d \
    && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
    && sudo apt update \
    && sudo apt install gh -y

※nvmコマンドやghコマンドの詳しい使い方は、他の記事に任せます。

参考

nvm で複数の Node.js バージョンを切り替えて使用する (Node Version Manager) - まくまく Node.js ノート

GitHub CLI クイックスタート - GitHub Docs

【Git】personal access tokenを使用してGitHubへアクセスする #初心者向け - Qiita

cronタスクの追加(※コツが要ります)

ChromebookのLinux上で自動化スクリプトが動くようになったら、cronに定期実行タスクを登録します。

cronが起動された状態で

crontab -e

を実行すると、vimでテキストを編集する画面になります。

crontabの書き方は下記などを参考にしてください。

www.yoheim.net

ここで注意事項があります。

cronが自動実行されるとき、~/.bashrcなどの設定ファイルは読み込まれません。

例えばそのままcrontabに

0 7 * * 3 npm run your-weekly-task

などと書いても、npmにはパスが通ってない状態でcronがタスク実行するため、エラーで動きません。

したがって、crontabに記述するコマンドには工夫が必要です。

私の場合は、npmを使用した自動化でしたが下記のようなスクリプト(my-weekly-task.sh)をcrontabに登録することで、実行できるようにしました。

crontabの記述

0 7 * * 3 /path/to/my-repository/my-weekly-task.sh

※事前に自分のシェルスクリプトをchmod +x /path/to/my-repository/my-weekly-task.shで実行可能にしておきましょう。

my-weekly-task.shの中身

#!/usr/bin/bash

export NVM_DIR="$HOME/.config/nvm"
source "$NVM_DIR/nvm.sh"

cd /path/to/my-repository

nvm use
npm run weekly-task

if [ -n "$(git status --porcelain)" ]; then
  git add log/weekly-task.log
  export TZ='Asia/Tokyo'
  COMMIT_DATE=$(date +"%Y-%m-%d %H:%M:%$S %Z")
  COMMIT_MESSAGE="[CRON] Weekly task completed: ${COMMIT_DATE}"
  git commit -m "$COMMIT_MESSAGE"
  git push
fi

※ついでに実行時のログをGitHubにpushして、別PCからログを見れるようにしてます。

(※ログをリモートリポジトリにpushするのは基本的にやるべきではないですが、楽なので一時的にそうしてます。真似しないでください。)

ちなみに cron にそのまま npm run を書いても動かないのは、本来 ~/.bashrc に書かれた下記の部分が cron だと呼ばれないからです。

export NVM_DIR="$HOME/.config/nvm"
source "$NVM_DIR/nvm.sh"

これは、nvmをインストールした後に、~/.bashrc に追記されるスクリプトで、一部抜粋して自分のシェルスクリプトに書き込むことで、npmコマンドへのパスが通るようになっています。

Chromeの電源設定の変更

Chromebookは、デフォルトだと蓋を閉じるとスリープしてしまいます。

スリープしてると cron が自動化タスクを実行できません。

スリープさせないようにChromebookの設定を変更しましょう。

下記の公式の手順の「Chromebook がスリープ状態にならないようにする」を参照してください。

support.google.com

まとめ

以上が、ChromebookをLinux鯖にして自動化タスクをやらせる手順です。

個人用のタスク自動化程度なら、上記で十分と思われます。

一方で、多人数のプロジェクトなどでバッチを回す場合は、安易なcronの使い方はしないほうがいいケースもあるようです。

詳しくは下記の記事などが参考になるので、興味のある方はのぞいてみてください。

先輩エンジニア「crontabには気をつけな... あいつは簡単に吹き飛ぶぞ...」 #初心者向け - Qiita

cronの仕組みについては下記の記事が非常にわかりやすかったです。

【図解】cronの仕組み #Linux - Qiita

参考リンク

Debian Linux Tux プラグインプログラマー Tシャツ

Debian Linux Tux プラグインプログラマー Tシャツ

  • Linux Debian Programmierer Tux Nerd Geek Geschenke
Amazon