Ctrl-Z ve kill -STOP arasındaki fark nedir?


14

Kabuktan bir komut çalıştırdığımda ( makebüyük bir projede), işlemi durdurmak ve kabuğa geri dönmek için Ctrl-Z yazabilirim. Daha sonra, fgsürece devam etmek için koşabilirim .

Bunu otomatikleştirmek için bir kabuk komut dosyası yazmaya çalışıyorum (özellikle, her birkaç saniyede bir CPU sıcaklığımı kontrol etmek ve çok ısınırsa işlemi durdurmak için, bilgisayarım aşırı ısınmaya eğilimli olduğundan). İlk denemem bu şekilde çalıştı (basitleştirilmiş):

make &
subpid="$!"

sleep 2
# If the CPU temperature is too high...
kill -STOP "$subpid"

sleep 2
# If the CPU temperature has dropped to safe levels...
kill -CONT "$subpid"

wait "$subpid"

Ne yazık ki, bu işe yaramadı; SIGSTOP'un sürece gönderilmesi işlemi duraklatmadı (terminale çıktı göndermeye devam etmesiyle açıkça görüldüğü gibi). make &Komut satırında koştum , SIGSTOP gönderdim ve işlem durumunu ps; durduruldu (ve SIGCONT'u gönderdiğimde yeniden başladı) olarak listelendi, ancak yine de çıktıyı püskürttü ve çekirdek sıcaklığımı artırıyordu! Ctrl-Z ile durdurmak hiç bu problem yaşamadım, ama bunu bir senaryoda nasıl yapacağımı bilmiyorum.

Ctrl-Z'yi farklı kılan nedir kill -STOPve bir kabuk komut dosyasında öncekinin davranışını nasıl alabilirim?


Ve evet, makeyinelemeli olarak yürütülüyor. Aslında bence birkaç seviye derinlere iniyor.
Taymon

Yanıtlar:


12

Ctrl-Z'yi farklı kılan nedir kill -STOPve bir kabuk komut dosyasında öncekinin davranışını nasıl alabilirim?

CTRL-Zgenellikle SIGTSTP (engellenebilir) gönderir ve - diğer şeylerin yanı sıra - mermiler genellikle bu durumlarda daha önce kaydedilmiş bir duruma sıfırlanır. Daha da önemlisi, kontrol eden terminal işlem grubu kabuğun PID'sine (ve sonra tekrar devam ettirilen bir işin PID'sine fg) ayarlanır .

Orijinal probleminize geri dönün: örneğin Cpufreqd gibi sıcaklığa bağlı bir frekans ölçeklemesi kullanmak aslında tırnağınız için daha iyi bir çekiç olabilir.



4

Bir oturum liderinin negatif PID değerini (PGID) belirtirseniz, bir işlem grubundaki tüm işlemlere sinyal gönderebilirsiniz.

kill -STOP -"$subpid"

Not: Bir programı yeni bir oturumda çalıştırmak için kullanın setsid make. Ama senin durumunda bence gerekli değil. Ancak, make özyinelemeli olarak çalıştırılırsa, her make örneği kendi lideri olabilir (bundan emin değilim).

Başka bir seçenek kullanmak olabilir killall:

killall -STOP make

Ctrl + Z ve kill -STOP arasındaki fark:

  • Ctrl-Z aslında engellenebilen TSTP gönderir.
  • STOP engellenemez.

Pgid yaklaşım işi vermedi ve çıktısının aşağıdaki satırı üretti: /usr/local/bin/myscript: line 38: kill: (-10202) - No such process. Arka plan işlemleri devam etti. killallYaklaşımın işe yarayacağını düşünmüyorum, çünkü bazı alt süreçler daha shziyade görünüyor make.
Taymon

Sinyali gönderdiğiniz işlem zaten bitmiş görünüyor. Sh adlı alt işlemler make tarafından üretilir. Marka ve birçok alt işlem durumunda, en iyisi muhtemelen tüm çocukların PID'lerini almak ve hepsini DURDURMAK olacaktır.
Jurij

Kabuktan manuel olarak yaptığımda çalıştım, ancak bir kabuk komut dosyasında değil. Bunun manuel olarak yaptığım zaman, kök PID'nin (diğerlerinin PGID'lerini devraldığı) ilk makekomutun olmasıydı , ancak komut dosyasından yaptığımda, kök PID kabuk komut dosyasının kendisinden kaynaklandığını düşünüyorum. .
Taymon

1

Ctrl+ Cbir işlemi sinyalle öldürmek için kullanılır SIGINT, başka bir deyişle kibar bir öldürmedir .

Ctrl+ Z bir işlemi , uyku sinyali gibi geri alınabilen ve işleme yeniden devam ettirilebilen SIGSTP sinyali göndererek askıya almak için kullanılır .

Ancak bir işlem askıya alındığında, fg (ön planda devam et) ve bg (arka planda devam et ) ile tekrar devam ettirebiliriz , ancak öldürülen bir işleme devam edemiyorum, bu Ctrl+ C& Ctrl+ kullanma arasındaki farktır Z.

Askıya alınan süreç nasıl görüntülenir ?

Birden fazla askıya alınmış komutunuz olduğunda, bunların listelenmesini sağlamak için jobskomutu kullanırsınız ve çıktı şu şekilde olur:

[1]-  Stopped                 cat
[2]+  Stopped                 vi

Arka planda askıya alınmış bir süreç nasıl öldürülür ?

killKomutu kullanarak :

kill %nNerede n Kediye öldürmek istiyorum böylece iş numarası (işler çıkışından köşeli parantez içinde bir) şöyledir: kill %1.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.