シェルスクリプトに書いた命令を指定時刻に実行する

前回の投稿「SSH接続:リモートのLinux上にローカルファイルを転送する」の続きです。
最終的な目標は、「FTP ファイル転送を指定時刻に自動実行」ですが、今回は指定時刻に処理を実行する「at コマンド」と、処理内容を書き込む「シェルスクリプト」について調べたことを書いてみます。

前提

改めて、今回の最終的な目標は「FTP ファイル転送を指定時刻に自動実行する」ですが、正確には「寝ている間でも FTP ファイル転送を指定時刻に自動実行する」なので、「手元のローカルマシンを起動しておかなければならぬ」では夢を実現できません。(多分)

なので、前回の記事のとおり、「さくらVPS にインストールした Linux」に、定められた時間に僕がどこで何をしていようとも、目的の処理を実行してもらうことをゴールとしています。

シェルスクリプト

まずはじめに、シェルスクリプトとは、実行するコマンドを書いた指示書みたいなもの。
今回の場合、シェルスクリプトに予め実行したい命令を書いておき、at コマンドで指定時刻にそれを実行することでプログラムの自動化が図れるっぽい。

  • 基本的な書き方
#!/bin/sh

% touch hoge.txt
% sh hoge.sh

at コマンド

デフォルトで at が入っていないのでインストールする。

% sudo apt install at

指示を書いたシェルスクリプトを指定時刻に実行するには、以下のように記述するようだ。

# 2022年9月19日 10:00 に hoge.sh の内容を実行
% at -f hoge.sh 10:00 091922

その他、使いそうなコマンド。

  • 実行予定のジョブ一覧を表示
% at -l
  • 実行予定のジョブを削除
% at -d <ジョブ番号>
  • 実行予定のジョブ内容を表示
% at -c <ジョブ番号>

シェルスクリプトに書いた命令を指定時刻に実行する

上記までの例のまんまだが、一連の流れを再現してみる。

  • まずは hoge.sh というファイル名でシェルスクリプトを作る
    • % vim hoge.sh
    • 記載内容は下記で hoge.txt というファイルを作るだけの内容
#!/bin/sh

% touch hoge.txt
  • 続いて at コマンドで実行する時刻を指定する
% at -f hoge.sh 13:10 091922
  • ジョブが登録されているか確認してみる
% at -l
5  Mon Sep 19 13:10:00 2022 a htksn
  • ちゃんと登録されているっぽいので、一旦 Linux から抜ける
    • 指定した時間がくるまでソワソワしながら正座待機
% exit
  • 時間が来たので再度 SSH 接続して Linux の様子をうかがってみる
% ssh htksn
% lsa

(中略)
-rw-r--r-- 1 htksn htksn    26 Sep 19 13:03 hoge.sh
-rw-r--r-- 1 htksn htksn     0 Sep 19 13:10 hoge.txt
(中略)

やったね!!

まとめ

ここまでで、「ローカルのファイルをリモートの Linux 環境に送る」と、「リモートの Linux 環境で指定時刻に処理を実行する」までは実現できた。
残りは「ファイルを FTP 転送する」をクリアできれば素晴らしき日々をまた一つ獲得できる(はず)

今回は以上です。

SSH接続:リモートのLinux上にローカルファイルを転送する

フィヨルドブートキャンプ』 というプログラミングスクールに入ってから約 1 ヶ月ほど経ったので、記念にブログを書いてみようと思います。

はじめに(ポエム)

フィヨルドブートキャンプでは、「Web アプリケーションを作りたいなら Linux に関する知識は必須」という理由から、Linux を学習するカリキュラムがあります。
僕はそれまで Linux という存在自体は知っていましたが、「自分は一生関与することはない」くらいに思っていたので、初めてインストールした時はその見た目に随分と面食らいました。

で、この Linux をインストールするのも「初心者にはかなりハードルが高いから『さくらVPS』を契約して、そこにインストールするのがいいよ」とのことで、おとなしく従うことに。
そこからコマンドラインの操作や Vim の知識などいろいろ学び、(自分にとっては関門だった)SSH 接続もなんとか理解できるようになり、悦に入るという次第。

モッタイナイ

ただ、Linux について最低限の理解ができたと言えども、使わなければすぐに忘れる。
なにより、あんまり使わないのに月々 600 ~ 700 円の利用料を垂れ流すのはモッタイナイ。

月々 600 ~ 700 円 = 年額約 8,000 円というと、ビール 2 ケースに相応する金額。
これを垂れ流すのはモッタイナイ。

そこで私は考えた。
「少しでも元を取ろう」

FTP ファイル転送を指定時刻に自動で実行したい

僕は本業の仕事で、とあるサイトの管理を請け負っており、こちらのタスクのひとつに「月に 5 ~ 6 回の頻度で指定時刻にファイルを FTP 転送せよ」という(やや面倒な)ものがあります。
作業自体は数分で終わるものの手動で対応が必要なため、「万が一忘れたらやばいな」というストレス、「FTP やらな」というタスクがいつまでも頭に残るストレスに支配されます。

そこで私は考えた。
「私には(身銭を投じている)Linux がいるじゃないか」

cron てのを使うといいらしい

よく分からないがググってみたところ、cron てのを使えば指定時刻に処理を実行でき、そこに FTP 転送する指示を書いたシェルスクリプトを置いておけばよいとのこと。

なんとなくイメージはできたものの、「はて?普段作業しているローカルのファイルを Linux に送るのってドウスルノ?」

【追記】

  • cronとcrontabの違い

「cron」は機能を示す名称で、一方「crontab」はコマンド名またはファイル名です。
【入門】cron(クロン)設定・書き方の基本 - カゴヤのサーバー研究室

  • cron は繰り返し行う処理を定期実行するもので、一度きりの自動実行には at を使うようでした。

crontab コマンドは、繰り返し実行するコマンドをスケジュールします。at コマンドは、1 回だけ実行するタスクをスケジュールします。
システムタスクを自動的に実行する方法

scp コマンドを使ってリモートの Linux 上にローカルファイルを転送する

scp コマンドというのを使えばいいらしい。

実際にやってみた

フィヨルドブートキャンプの学習において、SSH 接続する際にセキュリティ向上のため「鍵認証にする」「ポート番号変更」「パスワード認証・root 接続を無効化」といった設定を行い、さらに ~/.ssh/config をいい感じにして SSH 接続を簡単にできるようにしました。

なので、まずはこの .ssh/config を確認。
以下は例ですが、この例前提の内容です。

% cat .ssh/config
Host setsuzoku_name
    HostName    os1-111-11111.vs.sakura.ne.jp
    Port        12345
    IdentityFile    ~/.ssh/key_name
    User        user_name

適当なファイル (hoge.txt) を作る。

% cat << EOF > hoge.txt
heredoc> this is hoge
heredoc> EOF

% scp <送るファイル> <.ssh/config で設定したコマンド>:<転送先のディレクトリ> で良さそう。

% scp hoge.txt setsuzoku_name:~/
hoge.txt        100%   13     1.2KB/s   00:00

SSH 接続してみる。

% ssh setsuzoku_name

ファイルが転送されているか、中身も問題ないか確認してみる。

user_name@os1-111-11111 ~ % ls
hoge.txt
user_name@os1-111-11111 ~ % cat hoge.txt
this is hoge

とりあえず OK な様子です。

終わり

時間が来てしまったので、突然ですが閉店です。

cron てのと、シェルスクリプトについてはまだ使ったことが無いので、調べてやってみてから改めてブログに書いてみようと思います。

ご高覧いただき誠にありがとうございました m(__)m

【追記】