先週の週報お休みしてしまいました。ごめんなさい。
ChromebookをLinux鯖にして自動化タスクをやらせる(cronでnpm runする例)

この記事の要約
- 自宅の余ってた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を使えるようにしましょう。
デフォルトだと Debian が使えるようになります。
Chromebookの性能は基本的に低スペックですが、Linux自体軽いのでモッサリすることは基本的に無かったです。
ここから先は基本的にCLIなので、黒い画面と仲良くなりましょう。
Linuxターミナルのショートカット設定をする
Linuxターミナルを入れたばかりだと、ターミナル上でショートカットがまだ使えません。
また、USキーボードを使用してる場合、日本語入力切り替えが効かず不便です。
画面下のタスクバーのLinuxターミナルのアイコンを右クリック>設定>キーボードとマウス と開き、
キーボード にある項目を全部オンにしましょう。
これで日本語切り替えや、Ctrl+C、Ctrl+Vでのコピペが楽になります。
※スクショ付きの解説は下記の記事が参考になります。
必要なツールのインストール
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コマンドの仕様は下記を参考。
systemdについてもっとガッツリ知りたくなったら下記の書籍。
必要なパッケージ・ライブラリのインストール
※ここでインストールするものは、自分のリポジトリ依存です。
※各自で自分のタスク実行に必要なものを適宜インストールしてください。
私の場合は、Node.jsの実行環境(nvm)とGitHubCLI(gh)をインストールしました。
自分のリポジトリなどから自分が自動化したいタスクのソースコードをクローンして、
それらを実行できる環境をChromebookのLinux上に整えましょう。
nvm のインストール
上記のREADMEに書かれた手順に従って、
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
を実行。
GitHubCLIのインストール
上記リンクに書かれた下記スクリプトを実行
(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の書き方は下記などを参考にしてください。
ここで注意事項があります。
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 がスリープ状態にならないようにする」を参照してください。
まとめ
以上が、ChromebookをLinux鯖にして自動化タスクをやらせる手順です。
個人用のタスク自動化程度なら、上記で十分と思われます。
一方で、多人数のプロジェクトなどでバッチを回す場合は、安易なcronの使い方はしないほうがいいケースもあるようです。
詳しくは下記の記事などが参考になるので、興味のある方はのぞいてみてください。
先輩エンジニア「crontabには気をつけな... あいつは簡単に吹き飛ぶぞ...」 #初心者向け - Qiita
cronの仕組みについては下記の記事が非常にわかりやすかったです。
参考リンク
週報63 スマホを埋めて旅に出る
noteに書きました。






