Linux
 Computer >> コンピューター >  >> システム >> Linux

LinuxでBashコマンドをバックグラウンドで実行する方法まとめ

ターミナルでコマンドを実行したら、数分、場合によっては数時間も処理が終わらず、その間ターミナルをまったく使えなくなってしまう――これほどストレスの溜まることはありません。もちろんタブ機能を使う手もありますが、やや不便な解決策ですし、作業中に進捗を確認したい場面では最適とは言えません。この記事では、LinuxでBashコマンドをバックグラウンドで実行するいくつかの方法をわかりやすく紹介します。

コマンドの末尾に「&」を付けて実行する

コマンドをバックグラウンドに送りたいだけなら、末尾に&を付けるのが最も手軽な方法です。こうすることで、コマンドが実行中でも引き続きターミナルを操作できます。ただし注意点もあります。&を使ってもコマンドとユーザーの接続が完全に切れるわけではなく、単にバックグラウンドへ移されるだけです。そのため、ターミナルを使用している最中でも、コマンドがSTDOUTSTDERRへ出力しようとする内容はすべて画面に表示され続け、作業の邪魔になることがあります。

LinuxでBashコマンドをバックグラウンドで実行する方法まとめ
COMMAND &

また、ターミナルセッションを閉じるとコマンドも終了してしまいます。実行中のコマンドを停止したい場合は、jobsコマンドでジョブ番号を確認し、killコマンドで終了させましょう。構文は以下の通りです。

LinuxでBashコマンドをバックグラウンドで実行する方法まとめ
kill %1

&の使い方は、一時的に処理を後回しにしたいものの、永続的に実行し続ける必要がない場合に適しています。

「&」に加えてdisownコマンドを使う

&だけでコマンドを実行した場合、ターミナルウィンドウが開いている間しかコマンドは動き続けません。しかし、ターミナルセッションを終了した後もコマンドを実行させたい場合は、disownコマンドを活用しましょう。

まずは通常どおり、&を付けてコマンドを実行します。

COMMAND &

前述のとおり、&はコマンドをバックグラウンドへ送るだけで、シェルとの関連付けは残ったままです。ターミナルでjobsと入力すると、先ほどと同じようにバックグラウンドで実行中のコマンドが表示されます。

そこで、シェルにdisownと入力してください。これによりコマンドはシェルから切り離されます(再度jobsコマンドで確認できます)。

LinuxでBashコマンドをバックグラウンドで実行する方法まとめ

これでターミナルを閉じても安心です。コマンドは引き続きSTDOUTSTDERRへ出力を行いますが、一度ターミナルを終了して開き直せば、その出力を目にすることはありません。実行中のプロセスはtoppsコマンドで見つけられ、killコマンドで終了させることができます。

LinuxでBashコマンドをバックグラウンドで実行する方法まとめ

「&」と/dev/nullを組み合わせる

コマンドの末尾に&を付けるとバックグラウンド実行になりますが、その反面、バックグラウンドのコマンドがターミナル上にメッセージを出力し続けるという副作用があります。これを防ぎたい場合は、出力を/dev/nullへリダイレクトするのが効果的です。

LinuxでBashコマンドをバックグラウンドで実行する方法まとめ
COMMAND &>/dev/null &

ただしこの方法でも、ターミナルを閉じるとコマンドが終了してしまう問題は解決しません。前述のようにdisownを併用すれば、実行中のコマンドをシェルから切り離すことが可能です。不要になった場合は、いずれかの方法でプロセスを終了させてください。

nohup+&+/dev/nullの組み合わせ

ここまでのコマンドとは異なり、nohupを使えば、コマンドをバックグラウンドで実行し続けることが可能です。その仕組みはどうなっているのでしょうか。nohupはHUPシグナル(ハングアップシグナル)を無視するため、ターミナルを閉じた後でもコマンドをバックグラウンドで走らせ続けられます。さらに「/dev/null」へのリダイレクト(nohupによるnohup.outファイルの生成を防止)と組み合わせれば、たった1行のコマンドですべてをバックグラウンド化できます。

nohup COMMAND &>/dev/null &
LinuxでBashコマンドをバックグラウンドで実行する方法まとめ

まとめ

現在のLinux向けターミナルアプリの多くには、少ない手間でプログラムをバックグラウンド実行できる機能が標準搭載されています。さらに、systemdのようなモダンなinitシステムを使えば、システム起動時や任意のタイミングでプログラムをサービスとして開始することも可能です。

とはいえ、Linuxにはデーモンとして動作できなかったり、最新のinitシステムに対応していなかったりするプログラムも存在します。確かに不便ではありますが、すべての開発者が新機能の追加に必要なスキルや時間を持っているわけではないため、無理もないことです。

幸い、nohupdisownといったコマンドは今でも現役であり、こうしたプログラムをバックグラウンドへ移す際のギャップを埋めてくれます。決して完璧でおしゃれな手法ではありませんが、必要なときに確実に役割を果たしてくれる頼れる存在です。


  1. Linuxのteeコマンド使い方ガイド|画面表示とファイル保存を同時に実現

    Linuxシェルでパイプやリダイレクトを使っているなら、teeコマンドの出番もきっとあるはずです。teeは「標準出力に表示しながら、同時にファイルにも書き込む」ことができる便利なユーティリティです。この記事では、teeコマンドの基本操作から、sudoとの組み合わせ、追記モード、エラー出力の扱い方まで、実例を交えながら詳しく解説します。 teeコマンドとは何をするもの? まず、次のようなコマンドを見てみましょう。 ls このコマンドは、現在のディレクトリの内容を表示します。つまり、標準出力(stdout)へ出力するわけです。標準出力とは通常、画面、正確には仮想端末のディスプレイのことです

  2. Linuxの「at」コマンドでタスクを予約実行する方法|インストールから応用テクニックまで

    初めてアクセスの多いサーバーを管理していた頃、ユーザーが誰もいない時間を見計らってサーバーを再起動する必要がありました。観察してみると、そのタイミングは深夜3時頃でした。「こんなに不便なことはない。再起動のためだけに夜中に起きるなんて…」と思ったのですが、5秒後にはすぐに気づきました。「これはLinuxだ。こんな単純な作業なら簡単に自動化できるはずだ」と。こうしてatコマンドとの出会いが訪れたのです。 atは非常に使いやすいユーティリティです。日付と時刻をコマンドライン引数として渡し、その後に実行したいコマンドを1つ以上入力するだけです。 サーバー環境では、無人での操作が必要になる場面が多い