Gazelle
2020年10月17日公開 1081 Views

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ディレクトリであることが確認された。めでたしめでたし。

関連記事

ps axuをして全プロセスを表示し、該当するpidを指定してkillすれば良いという話
2020年03月18日
Railsアプリの独自ドメイン取得からSSL設定まで一貫して行います。環境はCentOS7、サーバはNginx、SSL化には無料のLet's Encryptを使用。
2020年03月18日
さくらVPSでコマンドが何故か重くなった時に、コンソールのCPU使用時間やtopコマンドでのCPU使用率を調査して原因を特定し、不要プロセスを終了させようという話。
2020年04月03日
node用version管理ツールnvmをインストールして、任意のnode versionを使う方法を解説
2020年07月30日
Linuxのsedコマンドを使えば、簡単にファイル内の置換を行うことができる。正規表現のスラッシュ区切りを使わずにバーティカルバーを使って簡潔に書くことも可読性を高めるうえでは重要なテクニックとなる。
2021年07月07日
ホームへ戻る