crontabを編集してnodeなどのプログラムを実行する
ユーザとして実行して上手くいったプログラムをcrontab -e
で実行すると上手く行かないケースなどは多々ある。基本の実行ができれば後はbashファイルの読み込み、実行ユーザ、相対パスの起点について抑えればnodeに限らず難なく動かせるはずである。
まずは時間を確認してcronが確実に動くかを確認
dateで時間を確認
[yamanaka@118-27-1-231 tools]$ date
Sat Oct 17 14:34:12 JST 2020
crontab -eと打ち、cronを編集、ファイルが作成されるかを確認
40 14 * * 0-6 cd /home/yamanaka;touch crontest.txt
crontest.txtが作成されていたら、まずはcronが動いている事が確認できる。
bashrcは明示的に書かないと読み込まれない
次にbashrcを読み込むためにsource /home/yamanaka/.bashrc
をcronの最初のコマンドで実行する。bashrcを抜き出すと次のようにnodeの安定versionを使う設定をしている。
nvm use stable
このversionをversionfile.txtに出力させたい。下記のように記述。
46 14 * * 0-6 source /home/yamanaka/.bashrc; node -v > /home/yamanaka/crontest.txt
bashrcの内容を全て読み込む必要が無いならばbashrcの代わりにsetup.sh
などのファイルを作成して、それをcronで読み込めばよい。
早速確認crontext.txtの中身を確認
$ cat crontest.txt
v14.13.1
上手く読み込めている事が確認できた。
実行ユーザはcrontabを設定したユーザなので~は使用できる
Home DirectoryへのPathが有効化を~
が効くかで検証してみる。
08 16 * * 0-6 source /home/yamanaka/.bashrc; cd ~/public_html; node -v > crontest2.txt
するとpublic_html以下にcrontest2.txtが生成されているためこれは問題なく使えそうである。
nodeの相対Pathはファイル起点と実行場所起点の2通り
writeFileSyncは実行ディレクトリからの相対パスで注意が必要でも述べているが、
- requireでのモジュールのロードは、ロード元からの相対パス
- writeFileSyncなどデータの読み書きはプログラムの実行ディレクトリからの相対パス
なので、普段実行しているプログラムの場所に移動してやらないとno such file or directoryなどのエラーが出力されてしまう。ちなみにcronを実行する時の初期ディレクトリはユーザディレクトリとなる。下記をcrontabの編集で記述し実験してみる。
15 16 * * 0-6 pwd > crontest3.txt
この結果、crontest3.txt
には次のように書かれている
/home/yamanaka
これでhomeディレクトリであることが確認された。めでたしめでたし。