Bir arka plan süreci askıya alma ve ön plana çıkarma


166

Başlangıçta ön planda çalışan bir işlemim var. Ctrl+ İle askıya aldım Zve ardından arka planda çalışmasına devam ettim bg <jobid>.

Arka planda çalışan bir işlemi askıya almak nasıl acaba?

Bir arka plan işlemini ön plana nasıl getirebilirim?

Düzenle:

İşlem stderr'e çıkar fg <jobid>. İşlem terminale çıkarken komutu nasıl vermeliyim?


1
Hala komut yayma hataları olan bir terminale yazabilirsiniz. STDERR'de yazılmış olan metin giriş olarak sayılmaz, yalnızca gönderdiğiniz tuşlar olur. Ekranda kafa karıştırıcı görünüyor ama çalışıyor.
Caleb

@Caleb: İşlem stdout'a çıktığında bile, fg <jobid>ön plan yapmak için hala yazabilir miyim ?
Tim

@Tim: Evet, yapabilirsiniz.
Caleb

Yanıtlar:


214

Tim'in dediği gibi, fgson işlemi ön plana çıkarmak için yazın .

Arka planda çalışan birden fazla işleminiz varsa, bunu yapın:

$ jobs
[1]   Stopped                 vim
[2]-  Stopped                 bash
[3]+  Stopped                 vim 23

fg %3vim 23Süreci ön plana çıkarmak .

Arka planda çalışan işlemi askıya almak için aşağıdakileri kullanın:

kill -STOP %job_id

SIGSTOP sinyali bir süreci esasen Ctrl+ ile aynı şekilde durdurur (duraklatır) Z.

Örnek: kill -STOP %3.

kaynakları: Linux ve Unix'teki işlemlere sinyal gönderme ve Arka plan ve ön plan işlerini yönetme .


23
sinyal 19 SIGCONTbenim için; Yine de sayıları hatırlamayı tercih ediyorum kill -STOPve kill -CONTyine kill -lde sayısal değerleri kendinize hatırlatmayı kontrol edebilirsiniz
Yararsız

İşlem stderr'e gönderilir, peki komutu nasıl vereceğim jobve fg <jobid>işlem terminale çıkarken?
Tim

1
@Tim Sadece normalde yaptığınız gibi komutu yazın. İşin arka planı devam ettiği sürece, yazdıklarınızı okumuyorsunuz - kabuğunuz. Yazdıklarınız size ayrılmış gibi görünebilir, ancak kabuk bunu iyi anlayacaktır.
AlexWebr

@AlexWebr: Teşekkürler, işe yarıyor! (1) Bir arkaplan işi "Ctrl + Z" vb. Dahil hiçbir girişi ve çıkışı kabul etmiyor mu? (2) Arka planda çalışan bir iş doğrudan askıya alınabilir mi? Evet ise nasıl? Hayır ise, askıya alınmadan önce ön planda çalışacak şekilde değiştirilmeli mi?
Tim

2
Arka planda çalışan bir iş doğrudan evet askıya alınabilir mi : kill -STOP %job_idaçıklandığı gibi
Yararsız

31

Bu, gerçekten eski bir kabukla uğraşmadığınız sürece (çoğunlukla) alabileceğiniz iş kontrolü olan herhangi bir kabuk için geçerli olmalıdır. POSIX standardında olduğu için dashiş kontrolünü bile destekliyor (etkileşimli olarak veya birlikte çalışırken -m).

interaktif

  • Ctrl+ zmevcut planlanmış programı askıya alacaktır
  • bgEn son askıya alınan programın arka planını
    ( bg %2kontrol edebileceğiniz iş numarasıyla birlikte kullanın jobs)
  • fg en son askıya alınmış programı ön plana çıkaracak

İçinde istemi başka bir + zshile dolaylı olarak çalıştırmak için bir anahtar bağlama yazabilirsiniz :fgCtrlz

_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg

Muhtemelen bg, askıya alınma konusunda dolaylı olarak koşmanın akıllıca bir yolu vardır , ancak bu mantıksız görünüyor; en azından benim için Ctrl+ zkullanımımın çoğunluğu Ctrl+ ckırılmadığı için; Bunu kill %1yerine örneğin yerine takip etmek istiyorum bgve kesinlikle öldürmeyi varsayılan yapmak istemiyorum! (Bu mantık, artık bu anahtar bağlamayı neden artık kullanmadığımı da içeriyor: Bir işlemi durdurmak için Ctrl+ ' zya çarpıyorsam, yapmak istediğim son şey devam etmektir!)

Sigara interaktif

Farklı bir kabuk örneğindeyseniz (veya bazen sudokomutlar da dahil olmak üzere farklı bir kullanıcıysanız ), iş numaralarını kullanamazsınız.

İşlem kimliğini (PID) öğrendikten sonra, başka bir işleme devam edebilirsiniz. PID'yi pgrep …veya ile ps aux |grep …(veya aynı kabuktan jobs -l, veya $!) alabilir ve sonra çalıştırabilirsiniz:

kill -STOP $PID  # suspend
kill -CONT $PID  # continue (resume)

İşlem kimliğini bilmiyorsanız ve işlemin diğer örneklerini ada göre askıya alma konusunda endişelenmiyorsanız, bunlardan birine sinyal iletebilirsiniz:

killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args

A CONTbir programa sinyal ile durduruldu Ctrl+ z(ve bgsize sanki, 'd) (ön planda) ilerlemesini devam eder aynı fgo.

Re: Standart Hata

Bu sorunun düzeltilmesi standart hata hakkında bilgi veriyor:

İşlem stderr'e çıkar fg <jobid>. İşlem terminale çıkarken komutu nasıl vermeliyim?

Söz konusu işin arka planlı bileşenleri (veya tüm iş arka plan, belki de üzerinden geçmiş kill -CONT) olmadıkça , askıya alınırken çıktıyı görmemelisiniz.

Hala veri çıktısı alıyorsa (standart çıktıya veya standart hataya göre), terminalinizi görsel olarak karışık bir hale getirecektir, ancak girişinizin bir parçası olmadığından bu çıktının tümü göz ardı edilir. Bu, herhangi bir yazım hatası girmediğinizi bilmeyi zorlaştırabilir, ancak (kör) yazmanın fgEnteryeterli olması gerekir (birden fazla işiniz yoksa ve söz konusu olanın en yenisi olmadığı sürece, bu durumda iş tanımlayıcısına ihtiyacınız olacak. ).

İş tanımlayıcısını bulmanız gerekiyorsa, STOPyukarıdaki etkileşimli olmayan yöntemlerle sinyal göndermek için başka bir terminal kullanın . Bu, ekranınızı serbest bırakmalıdır (belki Enterbirkaç kez vurmak veya koşmak clearveya Ctrl+ L), böylece jobsiş tanımlayıcısını bulmak için koşabilir ve ardından bu numaranın fg %Nolduğu yerde koşabilirsiniz N.


İşlemleri duraklatmak ve sürdürmekle ilgili tek sorun, başka bir programla (örneğin RabbitMQ gibi) herhangi bir bağlantı kurarsanız, devam ettiğinizde bağlantının kopmasıdır.
Nav,

@Nav - Çünkü başsız koşmadın. Bash ve zsh'da, yalnızca arka planlı bir süreci reddetmeniz gerektiğine inanıyorum . Bu tür görevleri nohup veya screen veya tmux gibi bir terminal çoklayıcı ile çalıştırmayı tercih ederim . Bir nohup işlemi kaldıramazsınız (tıpkı arka planlı bir işlemi ayrı bir bağlantıdan sürdüremediğiniz gibi), ancak bir çoklayıcıya bağlanabilirsiniz.
Adam Katz

Bu bir arka plan işlemiydi. Terminali kapattım ve sunucuya başka bir terminalden giriş yaptım.
Nav

Evet, akılda tutulmadığı sürece başka bir kabuğun işlemine devam edemezsiniz. Bunun için ekran veya tmux öneririz.
Adam Katz

CONTCtrl + Z ile durdurulmuş bir işleme (iş / boru hattı) bir sinyal gönderirseniz , yapmamış olsanız bile arka planda devam edeceğine inanıyorum bg.
G-Man

10

Tip fgön plana getirmek için.


Teşekkürler! İşlem stderr'e çıkar fg <jobid>. İşlem terminale çıkarken komutu nasıl vermeliyim?
Tim

1
  1. jobskomutları içeren işleri listeler
  2. Hedef işinizi ön plana çıkarın fg; Örneğin: fg %4
  3. CTRL ZAskıya almak için vur
  4. Arka planda çalışmaya başlamak için, bg; Örneğin:bg %4

0

Bir işlemi sonlandırmak birkaç farklı şekilde yapılabilir. Genellikle, konsol tabanlı bir komuttan bir Ctrlctuş vuruşu (varsayılan kesme karakteri) gönderilmesi komuttan çıkar. Bu işlem ön plan modunda çalışırken çalışır.

Bir işlem arka plan modunda çalışıyorsa, önce bu pskomutu kullanarak İş Kimliğini almanız gerekir ve bundan sonra işlemi aşağıdaki gibi sonlandırmak için kill komutunu kullanabilirsiniz:

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

Burada killkomut first_oneişlemi sonlandırır . Bir işlem normal bir killkomutu yoksayarsa kill -9, işlem kimliğini aşağıdaki gibi kullanabilirsiniz :

$kill -9 6738
Terminated

1
Bu doğru olsa da, soruyu cevaplamıyor ...
jasonwryan
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.