2017-08-01 4 views
2

私はLinuxの一部であるすべての初心者ですので、遅くしてください。それはユーザのホームディレクトリに存在するのですalive.logPIDを使わずにバックグラウンドで実行されているwhileループを強制終了

while true; do echo "I'm alive" >> alive.log ; done & 

スクリプトの出力をファイルに保存されます。

私はバックグラウンドで実行している「スクリプト」を作成しました。 問題は私がディスクスペースを満たしているのでループを殺す方法がないということです。ファイルを削除したい場合はループを作成して新しいファイルを作成し、 "I'm alive"のテキストを入力してくださいそれが頼まれました。

は、私が使用してみました:

ps - aux | grep while 

または

ps - aux | grep alive 

2ライン分の出力を私が必要とするPIDを与えるだろうが、問題は、スクリプトがPIDを意味し、ループがあるということです(再帰的に)実行されるたびに変更されるので、PIDを使用してプロセスを終了することはできません。

私も使用してみました:

pkill while 
killall while 

を一方-c「0」またはkillallをながらpkillコマンドを使用する場合、両方のラインのための結果が0(出力を見ることができるされている:「つつ:どのプロセスが見つかりません」;

任意の提案をしてください?

+3

これをフォアグラウンドで取得し、ctrl-cで強制終了するには 'fg'と入力します。 –

+2

...または 'kill%1'です。 'help kill'をチェックする – hek2mgl

+2

'jobs'とタイプし、スクリプトを見つけて(例えば' [1] + Running ... ')、' kill%1'(または '[]'にあったもの)でkillします。 – randomir

答えて

0

私はwhile.shという名前のスクリプトファイルに文を書き、シェルがそれを実行しました:

[[email protected] workspace]$ ./while.sh 
[[email protected] workspace]$ 

PIDがありません。 私はwhile.shを検索するtopコマンドツールを使用し、それは私に言った:

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND                 
4036 edemon 20 0 5268 756 436 R 97.3 0.0 0:07.93 bash                  
2469 root  20 0 94412 29m 10m S 7.8 2.0 1:49.19 Xorg                  
2788 edemon 20 0 74300 12m 10m S 1.9 0.9 1:38.79 nm-applet                
4040 edemon 20 0 2708 1072 796 R 1.9 0.1 0:00.01 top 

しばらくの父プロセスはbashのであるので、私はalive.logの4036サイズがこれ以上成長しなかったが死亡しました。

0

私はバックグラウンドであなたの「スクリプト」を試してみることにしました。私は

while true; do echo "I'm alive" >> alive.log ; done & 
を実行すると、

プロセスIDを標準出力に返し、プロセスがバックグラウンドで実行されていることを示します。あなたがこのプロセスIDを殺すことができます。

kill <pid> 
+0

ありがとうございます!あなたが私の投稿をアップしていただければ幸いです。また、コードを読みやすくするためにUlysse BNに感謝したいと思います。 – ssharma

0

、2回を再起動しようとした最初の時間は動作しませんでしたが、2番目の後のループはもう存在せず、ファイルを書き換えることではないでしょう。私はそれを処分した後

また、私は、スクリプトを再入力:

出力がPIDあるスクリプトを入力するときにループは私ができたPIDを変え続けていても、@ssharmaで述べたように
while true; do echo "I'm alive" >> alive.log ; done & 

そのPIDでループを終了させます。

ありがとうございました!

0

あなたはあなたがps -efを命じる場合bashとして表示するように起こっているスクリプトを実行した場合は、次のようにもbashプロセスに

UID  PID PPID C STIME TTY   TIME CMD 
james 27262 2448 98 17:35 pts/3 00:00:12 bash 
james  2448 2446 0 Jul19 pts/3 00:04:49 bash 

(あなたがbashを使用している場合)とその親のpidポイント(PID 27262はあなたですタイトな小さなループ)。したがって、bashのプロセスをすべて親として持つすべてのbashプロセスを見つけてください。これはうまくいく可能性があります:

$ awk '/^james/ && $NF=="bash" && NR==FNR{a[$2];next} /^james/ && $NF=="bash" && $3 in a{print $2}' <(ps -ef) <(ps -ef) 
27262 
27359 

だから、それらは殺害のための良い候補です。この場合、もう1つはps -efで、もう1つはマークです。

1

これはコメントの@James Brownによる回答です。

タイプfgこれをフォアグラウンドで取得し、これを解決する最も速い方法はctrl-cで終了します。

関連する問題