こんにちは、ともはるです。
先日、業務でAWSEC2のターミナルからSQLを流していたのですが、ターミナルのタイムアウトによりSQLが停止する問題が起こりました。
そこでタイムアウトしても処理が続くように、コマンドをバックグラウンドで流す方法について学んだので、備忘録として書いていきたいと思います!( ..)φメモメモ
この記事の対象者
- バックグラウンドで処理を実行したい人
- ターミナルとの接続切れで動かしている処理を止めたくない人
バックグラウンドによるコマンド実行
バックグラウンド実行はコマンド末尾に&
を付けることで実行することが出来ます。バックグラウンドで別の処理を流しながらターミナルで違う作業をしたい場合は下記のコマンドが有効です。
${コマンド} &
ただし、ターミナルの画面を閉じたりログアウトしたりするとバックグラウンド実行しているコマンドは終了するので、大量な処理を実行する場合は不向きですね。
ターミナルを閉じたりしても処理を実行する方法としてはnohupコマンド
があります。
nohupコマンド
nohupコマンド
は下記のように、コマンドの先頭にnohup
を付けることで実行できます。
$nohup {コマンド} &
こちらはターミナルを閉じたりログアウトしても実行され続けるため、大量データを扱ったり大量のスクリプトを流したい場合はこちらを使うといいかもしれません。
見えないところで実行し続けるため、ファイルやDB操作などを行う場合はコマンドに問題ないことを確かめたうえで実行したり、処理を小分けにして実行するのがおすすめです。
バックグラウンド実行の進捗状況確認
nohup {コマンド} &
だとバックグラウンド実行されるので実行状況が分からないと思います。その時は、下記のコマンドを実行することで実行中のコマンドの出力を確認することが出来ます。
//コマンド実行
$nohup {コマンド} > log.txt 2>&1 &
//ログの確認
$tail -f ./log.txt
2>&1
はざっくり説明すると標準出力と標準エラー出力を出力させるもので、正常処理だけでなく、異常系も確認することが出来ます。またtail -fコマンド
により、書き込み中のファイル状態をモニタリング出来るため、実行中の処理を眺めることも可能です。
参考:https://sry.hatenablog.jp/entry/2020/03/29/142630
まとめ
ターミナルによるバックグラウンド処理について書いてみましたがいかがでしたでしょうか。
&
を付けることでバックグラウンド処理になりますが、「ターミナルを閉じると処理が停止することを知らずに、バックグラウンド処理を流してターミナルを閉じる」なんてことがあったら悲しいですよね笑
私自身nohup {コマンド} &
でバックグラウンド実行だと思ってたのですが、&
でバックグラウンド実行になるなど、記事を書く中で色々なことを学べてとても勉強になりました。
また何か発見があれば記事にしようと思うので今回はこれにて失礼します。