やべえ...PCのバッテリーも尽きそう(ThinkPadいわく、残り5分)なのに、SFTP転送に30分かかる処理やんなきゃ...そんなときに調べたことの備忘録です。
やりたいこと
- ターミナルを閉じてもSFTPの転送を実施する
- なるべく対話処理をしない(バッテリーのライフは危機的じょうきょうだからね!)
- 失敗しても叩くコマンドを少なく再実行可能にしたい
やったこと
nohup ...
でターミナルを閉じてもプロセスがキルされないようにする。- 1のnohupつきでSFTP転送のコマンドを実行
nohup sftp -o "batchmode no" -b sftp_to_hoge ponz@aaa.bbb.ccc.ddd
Ctrt + Z
で処理を中断bg (プロセス番号)
でバックグラウンドに回す
それぞれ何をやっているか、具体的に分解します。
1. プロセスをキルされないようにする
ターミナルをそっと閉じると、実行中のプロセスは閉じた瞬間に終了します。(MySQLコマンドみたいに裏で流れ続けるものもあるけど)
プロセスを終了させないための、nohup
コマンド。肝としては、コマンドの最後に &
をつけないこと。
これをつけてしまうといきなりバックグラウンドに処理が回って、パスワード入力できないのね。
2. SFTP転送のコマンド実行
今回の肝の部分。上のリンクにもある通り、オプション付きで実行します。
-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
で書いてあげたほうがいいかも。