Linux でバックグラウンド タスクを実行するために nohup と screen を使用する例と違いの簡単な分析

Linux でバックグラウンド タスクを実行するために nohup と screen を使用する例と違いの簡単な分析

SSH ターミナル (putty、xshell など) を使用して Linux サーバーに接続し、時間のかかるタスクを実行すると、完了するまでに数時間または数日かかる場合があります。この時点で、ターミナルは占有されており、他のタスクもまだ実行する必要があります。したがって、この種の時間のかかるタスクをバックグラウンドで実行する必要があります。ログを記録するだけで済みます。この要件を満たす一般的な方法は次のとおりです。

指示 &

ターミナルにコマンド & を入力して実行します。このとき、プログラムはバックグラウンド実行中の & の SIGINT1 シグナルの影響を受けないため、Ctrl + C を使用してコマンドを終了しても無効となり、実行が継続されます。 ただし、ターミナルを直接閉じると、プロセスは終了します。 & を使用してバックグラウンドで実行されているプロセスは SIGHUP2 シグナルによって終了されることがわかりますが、exit コマンドを使用してターミナルを通常どおり終了すると、プログラムはバックグラウンドで実行され続け、終了されません。

nohup コマンド

デフォルトでは、標準出力は現在のディレクトリの nohup.out に追加されます。現在のディレクトリの nohup.out ファイルが書き込み可能でない場合、出力は$HOME/nohup.outファイルにリダイレクトされます。

次に、これら 2 つの機能を組み合わせて、次のようなコマンドを実行することを考えるのは簡単です。

nohup command > /home/user/myfile.log 2>&1 &

これにより、タスクは完了するまでバックグラウンドで実行され、プログラムの標準出力 (1) と標準エラー (2) がファイル /home/user/myfile.log に送信されます。

スクリーンツール

Screen はセッション ウィンドウ管理ツールとして理解できます。一般的な使用では、次の操作のみを使用する必要があります。

# yumを使用してscreenをインストールする
yum インストール画面
# test screenという名前のセッションウィンドウを作成する -S test
# 一時的にウィンドウを閉じる Ctrl+ad (Ctrl キーを押しながら a、d を順に押す)
# 既存のセッションウィンドウ画面を表示する -ls
# ウィンドウ画面に入る -r test
screen -r プロセスID
# ウィンドウを閉じる
# ウィンドウの切り替え Ctrl+ac: 現在の画面セッションにウィンドウを作成 Ctrl+aw: ウィンドウリスト Ctrl+an: 次のウィンドウ Ctrl+ap: 前のウィンドウ Ctrl+a 0-9: 0 番目のウィンドウと 9 番目のウィンドウを切り替える

screen ツールを使用すると、ターミナルにウィンドウを作成し、必要なコマンドを実行してから一時的に離れて、他の作業を続行できます。もちろん、他のターミナルを使用してサーバーに接続し、screen -r コマンドを使用して必要なウィンドウに接続することもできます。プログラムは常に実行されており、ターミナルを終了しても、一時的に離れたターミナルで実行されているプログラムには影響しません。

テスト:

テスト スクリプト test.sh を作成します。

#!/bin/sh
((i=1; i<1000; i++)) の場合
する
  d=`日付 '+%Y-%m-%d %H:%M:%S'`
  echo "$d $i 番目の出力;"
  tt
  2秒寝る
終わり
バッシュ

バックグラウンドで実行するには & を使用します:

[root@localhost test.cc]# ./test.sh > test.log 2>&1 &
[1] 15037
[root@localhost test.cc]# ps -aux | grep test.sh
ルート 15037 0.0 0.0 113180 1424 ポイント/0 S 16:10 0:00 /bin/sh ./test.sh
root 15045 0.0 0.0 112712 992 ポイント/0 S+ 16:10 0:00 grep --color=auto test.sh
バッシュ

15037 個のプロセスが実行中であることがわかります。

ターミナルを直接閉じると、ログ記録が停止し、ターミナル セッションの終了時にプロセスの実行が停止したことが示されます。

しかし、テストを繰り返した結果、exit コマンドで通常通りターミナルを終了し、再度ターミナルに接続すると、& で実行したプログラムが継続して実行される、つまり & コマンドは nohup と同じ効果があることがわかりました。ここで使用しているテスト環境は CentOS7.6 です。

nohupを使用して実行

[root@localhost test.cc]# nohup ./test.sh > test.log 2>&1 &
[1] 14349

テスト結果: ターミナルを直接閉じるか、exit コマンドを使用してターミナルを終了すると、プログラムは実行を継続します。

画面を使用して実行

# ウィンドウ画面を作成 -S テスト
# コマンドを実行します。最後に & は必要ありませんが、プログラムはウィンドウを占有します。/test.sh > test.log 2>&1 &
# 一時的にCtrl + 広告を残す

この時点で、ターミナルを直接閉じてから再接続することができます。プログラムがまだ実行されていることがわかります。ウィンドウ接続を確認するには、次の手順を実行します。

# 既存のウィンドウ [root@localhost ~]# screen -ls
画面は次の通りです:
  18048.test (分離)
/var/run/screen/S-root にソケットが 1 つあります。
# ウィンドウに入る [root@localhost ~]# screen -r test

入力した後、ウィンドウは、以前に入力したプログラムやコマンドを含め、終了する前の状態を維持していることがわかります。ウィンドウを終了するためにウィンドウで exit コマンドを入力する場合、前のコマンドの後に & を使用しないと、プログラムは終了します。これは、テスト ウィンドウに対して、これがフォアグラウンド プログラムであるため、ウィンドウが終了するとプログラムは自然に終了します。

screen の一時デタッチ機能により、フォアグラウンド プログラムは一時デタッチ ウィンドウで引き続き実行できます。実際の端末と比較すると、バックグラウンドで実行されているのと同等です。

プログラム終了(割り込み)信号は、ユーザーが INTR 文字(通常は Ctrl-C)を入力したときに発行され、フォアグラウンドプロセスグループにプロセスを終了するように通知するために使用されます ↩︎

ターミナル接続が終了したときに送信されます。通常はターミナルを閉じて、同じセッション内の各プロセスグループに通知します ↩︎

要約する

上記は、エディターが紹介した Linux で nohup と screen を使用してバックグラウンド タスクを実行する例と違いです。皆様のお役に立てれば幸いです。ご質問がある場合は、メッセージを残してください。エディターがすぐに返信します。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • Linux に Redis をインストールし、バックグラウンドで実行し、システムが自動的に起動するように設定する方法
  • Linux のバックグラウンドで実行するいくつかの方法 (まとめ)
  • Linux でバックグラウンドで実行中のプログラムを表示して終了する方法
  • Linux nohup はプログラムをバックグラウンドで実行し、表示します (nohup と &)
  • Linux で jar パッケージを起動してバックグラウンドで実行する方法
  • Linux で実行中のバックグラウンド プログラムを表示および終了する方法
  • LinuxのバックグラウンドでPythonプログラムを実行するいくつかの方法
  • Linux のバックグラウンドで Springboot を実行する方法
  • Linux バックグラウンドでノード サービス コマンドを実行する方法
  • Python Nohup Linux バックグラウンド実行出力の問題を解決する
  • Linux でバックグラウンドでプロセスを確実に実行する方法の概要
  • Linuxのバックグラウンド操作とシャットダウンの詳細な説明、バックグラウンドタスクの表示
  • Linuxコマンドをバックグラウンドで実行する方法

<<:  MySQL 8.0.11 圧縮版のインストールチュートリアル

>>:  ネイティブJSで実装されたギャラリー機能

推薦する

Linux での i3 ウィンドウ マネージャーの設定と使用に関するチュートリアル

この記事では、Fedora 28 に i3 をインストールして簡単に設定する方法を説明します。 1....

Linuxで新しいユーザーを作成し、指定されたディレクトリへの権限を付与する

1 ユーザーを作成し、ユーザーのルートパスとパスワードを指定します useradd -d /home...

MySQL 4 の一般的なマスタースレーブレプリケーションアーキテクチャ

目次1つのマスターと複数のスレーブのレプリケーションアーキテクチャマルチレベルレプリケーションアーキ...

MySQL SELECT文の実行方法

MySQL Select ステートメントはどのように実行されますか?最近、Geek Time で D...

Vue プロジェクトで SVG コンポーネントをパッケージ化して構成する手順

最近新しい会社に入社しました。プロジェクトに携わった後、タイトルアイコンが svg で作られていると...

mysql バックアップ スクリプトを作成し、7 日間保存します。

スクリプトの要件: MySQL データベースを毎日バックアップし、スクリプトを 7 日間保存します。...

Vue におけるキープアライブ マルチレベル ルーティング キャッシュの問題

目次1. 問題の説明2. 原因分析3. 解決策4. 処理1. 問題の説明調整センターでは、最後の 2...

CSS3で実装された水平ヘッダーメニュー

結果:実装コードhtml <nav class="dropdownmenu"...

Linux での MySQL 5.6.24 (バ​​イナリ) 自動インストール スクリプト

この記事では、Linux環境でのmysql5.6.24自動インストールスクリプトコードを参考までに共...

Linux でのプロセスデーモン スーパーバイザーのインストール、構成、および使用

Supervisor は非常に優れたデーモン管理ツールです。自動起動、ログ出力、自動ログカットなど、...

さまざまなMySQLインデックスの使用方法の詳細な説明

1. 遅いクエリログ1.1 MySQL ログの種類ログは、データベースの操作や、ユーザーがデータベー...

Web開発でボックスを中央に配置するいくつかの方法

1. ボックスを中央に配置するいくつかの方法を記録します。 1.0、マージン幅固定、高さ中央配置。 ...

スライドボタン効果を実現するネイティブJS

Jsで作ったスライドボタンの具体的なコードは参考までに。具体的な内容は以下のとおりですまずエフェク...

macOS SierraにApache2.4+PHP7.0+MySQL5.7.16をインストールする

Mac システムには PHP と Apache が付属していますが、必要なバージョンではない場合があ...

HTML で自動ページジャンプを実現する 5 つの方法

前回の記事では、HTML ページが 3 秒後に自動的にジャンプする一般的な 3 つの方法を紹介しまし...