GNU/Linux >> Linux の 問題 >  >> Linux

Linux Bash Scripting Part5 –シグナルとジョブ

前回の投稿では、bashスクリプトでの入力、出力、およびリダイレクトについて説明しました。今日は、Linuxシステムでそれらを実行および制御する方法を学習します。これまでは、コマンドラインインターフェイスからのみスクリプトを実行できますが、Linuxbashスクリプトを実行する方法はこれだけではありません。

この投稿では、Linuxbashスクリプトを制御するさまざまな方法について説明します。

Linuxシグナル

これらは最も一般的なLinuxシステム信号です:

数値 名前 仕事
1 SIGHUP プロセスがハングアップします。
2 SIGINT プロセスの中断。
3 SIGQUIT プロセスは終了または停止します。
9 SIGKILL プロセスの終了。
15 SIGTERM プロセスの終了。
17 SIGSTOP プロセスは終了せずに停止します。
18 SIGTSTP プロセスを終了せずに停止または一時停止します。
19 SIGCONT 停止後のプロセスの継続。

Linuxのbashスクリプトは、これらのシグナルを制御しません。シグナルを認識し、送信されたシグナルに基づいてコマンドを実行するようにbashスクリプトをプログラムできます。

プロセスを停止する

実行中のプロセスを停止するには、Ctrl + Cを押すと、SIGINTシグナルが生成され、シェルで実行中の現在のプロセスが停止します。

$ sleep 100

Ctrl + C

プロセスを一時停止します

Ctrl + Zキーを押すと、SIGTSTPシグナルが生成され、シェルで実行されているプロセスがすべて停止し、プログラムがメモリに残ります。

$ sleep 100

Ctrl + Z

角かっこで囲まれた数字(1)は、ジョブ番号です。

シェルを終了しようとして、停止したジョブがシェルに割り当てられている場合、bashは警告を発します。

psコマンドを使用して、停止したジョブを表示できます。

ps –l

S列(プロセス状態)には、トレース(T)または停止(S)状態が表示されます。

停止したジョブを終了する場合は、killコマンドを使用してそのプロセスを強制終了できます。

kill processID

トラップ信号

信号をトラップするには、trapコマンドを使用できます 。スクリプトがtrapコマンドで定義されたシグナルを取得すると、処理を停止し、代わりにスクリプトがシグナルを処理します。

次のようなtrapコマンドを使用して信号をトラップできます:

#!/bin/bash

trap "echo 'Ctrl-C was trapped'" SIGINT

total=1

while [ $total -le 3 ]; do

	echo "#$total"

	sleep 2

	total=$(($total + 1))

done

Ctrl + Cを押すたびに、信号がトラップされ、メッセージが出力されます。

Ctrl + Cを押すと、スクリプトを停止する代わりに、trapコマンドで指定されたechoステートメントが出力されます。かっこいいですよね?

スクリプト出口のトラップ

次のようなtrapコマンドを使用して、シェルスクリプトの終了をトラップできます。

#!/bin/bash

# Add the EXIT signal to trap it

trap "echo Goodbye..." EXIT

total=1

while [ $total -le 3 ]; do

	echo "#$total"

	sleep 2

	total=$(($total + 1))

done

bashスクリプトが終了すると、Goodbyeメッセージが期待どおりに出力されます。

また、作業を終了する前にスクリプトを終了すると、EXITトラップが発生します。

トラップの変更または削除

次のような新しいオプションを使用して、trapコマンドを再発行できます。

#!/bin/bash

trap "echo 'Ctrl-C is trapped.'" SIGINT

total=1

while [ $total -le 3 ]; do

	echo "Loop #$total"

	sleep 2

	total=$(($total + 1))

done

# Trap the SIGINT

trap "echo ' The trap changed'" SIGINT

total=1

while [ $total -le 3 ]; do

	echo "Second Loop #$total"

	sleep 1

	total=$(($total + 1))

done

シグナルトラップを変更した後、スクリプトがシグナルを管理する方法に注目してください。

トラップを削除することもできます 2つのダッシュを使用します。

trap -- SIGNAL
#!/bin/bash

trap "echo 'Ctrl-C is trapped.'" SIGINT

total=1

while [ $total -le 3 ]; do

	echo "#$total"

	sleep 1

	total=$(($total + 1))

done

trap -- SIGINT

echo "I just removed the trap"

total=1

while [ $total -le 3 ]; do

	echo "Loop #2 #$total"

	sleep 2

	total=$(($total + 1))

done

トラップを削除する前とトラップを削除した後、スクリプトが信号を処理する方法に注目してください。

$ ./myscript

Crtl + C

最初のCtrl+Cがトラップされ、トラップが削除されたため、2番目のCtrl + Cがスクリプトを終了する間、スクリプトは実行を継続します。

バックグラウンドモードでのLinuxBashスクリプトの実行

psコマンドの出力が表示される場合は、実行中のすべてのプロセスがバックグラウンドで表示され、端末に関連付けられていません。

コマンドの後にアンパサンド記号(&)を置くだけで、同じことができます。

#!/bin/bash

total=1

while [ $total -le 3 ]; do

	sleep 2

	total=$(($total + 1))

done
$ ./myscipt &

これを実行すると、スクリプトはシステム上の別のバックグラウンドプロセスで実行され、角かっこで囲まれたプロセスIDを確認できます。

スクリプトが終了すると、端末にメッセージが表示されます。

バックグラウンドプロセスの実行中は、ターミナルモニターを使用してSTDOUTおよびSTDERRメッセージを表示できるため、エラーが発生した場合は、エラーメッセージと通常の出力が表示されます。

ターミナルセッションを終了すると、バックグラウンドプロセスが終了します。

では、ターミナルを閉じても実行を継続したい場合はどうすればよいでしょうか?

ハングアップせずにスクリプトを実行する

nohupコマンドを使用してターミナルセッションを終了した場合でも、バックグラウンドプロセスでLinuxbashスクリプトを実行できます。 。

nohupコマンドは、SIGHUP信号をブロックします。ターミナルを終了するときにプロセスが終了するのを防ぎます。

$ nohup ./myscript &

nohupコマンドを実行した後、スクリプトからの出力やエラーは表示されません。出力メッセージとエラーメッセージをnohup.outというファイルに送信しました 。

注:同じディレクトリから複数のコマンドを実行すると、nohup.outファイルの内容が上書きされます。

ジョブの表示

現在のジョブを表示するには、jobsコマンドを使用できます。

#!/bin/bash

total=1

while [ $total -le 3 ]; do

	echo "#$count"

	sleep 5

	total=$(($total + 1))

done

次に実行します。

$ ./myscript

次に、Ctrl+Zを押してスクリプトを停止します。

同じbashスクリプトを実行しますが、バックグラウンドでアンパサンド記号を使用し、明確にするために出力をファイルにリダイレクトします。

$ ./myscript > outfile &

jobsコマンドは、停止して実行中のジョブを表示します。

jobs –l

-プロセスIDを表示するためのlパラメータ

停止したジョブの再開

bgコマンドを使用して、バックグラウンドモードでジョブを再開できます。

$ ./myscript

次に、Ctrl + Z

を押します

これで停止します。

$ bg

bgコマンドを使用すると、バックグラウンドモードで実行されます。

停止したジョブが複数ある場合は、bgコマンドにジョブ番号を指定することで同じことができます。

fgコマンドを使用できます フォアグラウンドモードでジョブを再開します。

$ fg 1

ジョブのスケジュール

Linuxシステムには、事前定義された時間にbashスクリプトを実行する2つの方法があります。

  • コマンドで。
  • cronテーブル。

atコマンド

これはコマンドの形式です

[-fファイル名]の時間

atコマンドは、さまざまな時間形式を受け入れることができます:

  • 10:15などの標準時間形式。
  • 午後11時15分のようなAM/PMインジケーター。
  • 今のような名前の付いた時間、真夜中。

いくつかの異なる日付形式を使用して、特定の日付を含めることができます:

  • MMDDYYやDD.MM.YYなどの標準の日付形式。
  • 年の有無にかかわらず、6月10日や2月12日などのテキストの日付。
  • 今+25分。
  • 明日午前5時15分。
  • 11:15+7日。

atコマンドを深く掘り下げたくはありませんが、今のところは単純にしてください。

$ at -f ./myscript now

システムに電子メールがある場合は、-Mパラメーターを使用して出力を電子メールに送信できます。ない場合は、atコマンドの出力が抑制されます。

保留中のジョブを一覧表示するには、atqコマンドを使用します。

保留中のジョブを削除する

保留中のジョブを削除するには、atrmコマンドを使用します。

$ atrm 18

atrmコマンドにジョブ番号を指定する必要があります。

スケジュールスクリプト

毎日または毎月かそこらで同時にスクリプトを実行する必要がある場合はどうなりますか?

crontabコマンドを使用してジョブをスケジュールできます。

スケジュールされたジョブを一覧表示するには、-lパラメーターを使用します。

$ crontab –l

crontabの形式は次のとおりです。

分、時、曜日、月、曜日

したがって、毎日10:30にコマンドを実行する場合は、次のように入力します。

30 10 ***コマンド

ワイルドカード文字(*)は、cronが毎月10:30にコマンドを実行することを示すために使用されます。

毎週火曜日の午後5時30分にコマンドを実行するには、次を使用します。

30 17 **2コマンド

曜日は0から6までで、日曜日=0と土曜日=6です。

毎月初めの10:00にコマンドを実行するには:

00 10 1**コマンド

月の日は1から31までです。

とりあえずシンプルにしましょう。cronについては今後の投稿で詳しく説明します。

cronテーブルを編集するには、次のように-eパラメータを使用します。

crontab –e

次に、次のようにコマンドを入力します。

 30 10 * * * /home/likegeeks/Desktop/myscript

これにより、スクリプトが毎日10:30に実行されるようにスケジュールされます。

注:リソースが一時的に利用できないというエラーが表示されることがあります。

あなたがしなければならないのはこれだけです:

$ rm -f /var/run/crond.pid

これを行うには、rootユーザーである必要があります。

とても簡単です!

次のような事前設定されたcronスクリプトディレクトリの1つを使用できます:

/etc/cron.hourly

/etc/cron.daily

/etc/cron.weekly

/etc/cron.monthly

これらのディレクトリのいずれかにbashスクリプトファイルを置くだけで、定期的に実行されます。

ログイン時にスクリプトを開始する

以前の投稿では、スタートアップファイルについて説明しました。それらを確認することをお勧めします。

$ HOME / .bash_profile

$ HOME / .bash_login

$ HOME / .profile

ログイン時にスクリプトを実行するには、コードを

に配置します。
$HOME/.bash_profile

シェルを開くときにスクリプトを開始する

OK、シェルが開いたときにbashスクリプトを実行するのはどうですか?簡単。

スクリプトを入力してください

 .bashrc

ファイル。

そして今、シェルウィンドウを開くと、そのコマンドが実行されます。

この投稿がお役に立てば幸いです。戻ってきてください。

ありがとうございます。


Linux
  1. Linuxでのプロセス間通信:ソケットとシグナル

  2. Linuxコマンド:jobs、bg、およびfg

  3. Linuxスクリプト:Bashでのwhileループの3つのハウツー

  1. Linuxでゾンビプロセスを見つけて殺す方法

  2. Linux シグナルの基礎 – パート I

  3. Linux:ゾンビ プロセスを見つけて強制終了する

  1. mmap、msync、および Linux プロセスの終了

  2. バックグラウンドでの Linux プロセス - ジョブで停止しましたか?

  3. Linux:所有されていないプロセスを表示して強制終了する