Ponz Dev Log

ソース派のシステムエンジニアの開発日記

ログアウトしてもSFTPでファイル転送させるやり方

やべえ...PCのバッテリーも尽きそう(ThinkPadいわく、残り5分)なのに、SFTP転送に30分かかる処理やんなきゃ...そんなときに調べたことの備忘録です。

やりたいこと

  • ターミナルを閉じてもSFTPの転送を実施する
  • なるべく対話処理をしない(バッテリーのライフは危機的じょうきょうだからね!)
  • 失敗しても叩くコマンドを少なく再実行可能にしたい

やったこと

  1. nohup ... でターミナルを閉じてもプロセスがキルされないようにする。
  2. 1のnohupつきでSFTP転送のコマンドを実行 nohup sftp -o "batchmode no" -b sftp_to_hoge ponz@aaa.bbb.ccc.ddd
  3. Ctrt + Z で処理を中断
  4. bg (プロセス番号) でバックグラウンドに回す

それぞれ何をやっているか、具体的に分解します。

1. プロセスをキルされないようにする

ターミナルをそっと閉じると、実行中のプロセスは閉じた瞬間に終了します。(MySQLコマンドみたいに裏で流れ続けるものもあるけど)
プロセスを終了させないための、nohup コマンド。肝としては、コマンドの最後に & をつけないこと。 これをつけてしまうといきなりバックグラウンドに処理が回って、パスワード入力できないのね。


2. SFTP転送のコマンド実行

webkaru.net

今回の肝の部分。上のリンクにもある通り、オプション付きで実行します。

-b ... このオプションの後に、処理するコマンドを記述することで、ファイルからコマンドを叩ける。いろんなページには .bat 拡張子で書かれたものを実行しているみたいだけど、拡張子なしでもいけた。

$ ls -1 /home/ponz/targets/*.csv
ponz_team.csv
ponz_workdays_2017.csv
ponz_worktime.csv

$ cat sftp_to_hoge
lcd /home/ponz/targets/
cd /mnt/hoge/datas/csv/
put *.csv
quit

-o ... 実行する環境によっては、Permittion denied と処理を続行できない場合がある。明示的にバッチ処理を行うことを宣言するため batchmode no とする。(バッチ処理なのに、batchmode no とか気持ち悪い...)

コマンド叩いてパスワードを求められたら、入れてEnterでOK。


3. 処理を中断

説明不要の、処理中断。jobs と叩くと「一時停止」となっているはず。

$ jobs
[1]+  Stopped (tty output)    nohup sftp -o "batchmode no" -b sftp_to_hoge ponz@aaa.bbb.ccc.ddd

4. 中断した処理をバックグラウンドに回す。

jobs で表示されていたジョブの番号を確認してから、bgコマンドでバックグラウンドに回してあげる。 もう一度 jobs でプロセスを確認してあげれば、バックグラウンドを表す & が勝手についているはず!

$ bg 1
$ jobs
[1]+  Running    nohup sftp -o "batchmode no" -b sftp_to_hoge ponz@aaa.bbb.ccc.ddd &

もうちょいスマートなやりかた

完全に対話処理をなくすなら、

  • 秘密鍵ファイル(identity)を置いて、-i オプション実行
  • expect コマンドで想定される標準出力に合わせてパスワード入力処理をバッチファイルに書く

どちらかでやればいいはず。 シェル化するならば、expect で書いてあげたほうがいいかも。

参考

d.hatena.ne.jp

qiita.com