Bash `suspend builtin komutunun amacı nedir?


22

Yazdım help suspendve bu kısa bir açıklama yaptım :

suspend: suspend [-f]
    Suspend shell execution.

    Suspend the execution of this shell until it receives a SIGCONT signal.
    Unless forced, login shells cannot be suspended.

    Options:
      -f    force the suspend, even if the shell is a login shell

    Exit Status:
    Returns success unless job control is not enabled or an error occurs.

Bunu nasıl anlıyorum: suspendYazarım ve terminal donuyor, strg + c bile çözülemiyor. Ancak başka bir terminal açıp dondurulmuş olanın kill -SIGCONT PID-NRPID'sini aradığımda ve bir SIGCONT sinyali yazdığım zaman donmuş terminale gönderilir ve çözülür, böylece donmaz hale gelir.

Ancak, bir terminali askıya almanın asıl amacı nedir? Hangi günlük uygulamalar bunun için tipiktir? Bunu bir kabuk yerleşik yapan insanların aklında ne vardı?


2
askıya almak için harici programları çalıştırmaktan kaçının (kill).
Ipor Sircer

Yanıtlar:


23

Bir kabuğu başka bir kabuktan başlatırsanız, içini askıya alabilirsiniz. Kullanırken suve bir an için normal kullanıcıya dönmek istediğinizi söyleyin :

user$ su
Password: ...
root# do something
root# suspend
user$ do something as the ordinary user again
user$ fg
root# ...

(Bunu yaparsanız, arka planda açılan ayrıcalıklı kabuğu unutma ...)

Benzer şekilde, başka bir programdan bir kabuğa kaçarsanız ( !örn. İçindeki komut less), kabuğu hala askıya alabilirsiniz. Ancak daha sonra kendisini askıya alan bir alt işlemi başlattıklarında pek çok programın bunu iyi bir şekilde ele almasını beklemem.


1
Sadece koşmayı denedim vimve :shbir deniz kabuğu (özellikle bir zshdeniz kabuğu) almak için yaptım . Koşmak suspendbeni orjinal kabuğuna attı (hem deniz altı hem de vim askıya alındı)
Kevin

1
@Kevin, zshbundan daha akıllı görünüyor bash, ikisinden de kaçmayı denedim lessve vi(Debian'ın vim.tiny): zshebeveyn uygulamasını da durdurdum bash, her şeyi kapattım . bashiçin bashişlerin bile.
ilkkachu

1
Farkında değildim, sudo su yazın ne bir alt kabuk başlatılır. ana kabukta askıya almayı yazdığımda kabuk sadece donuyor, ama gösterdiğin gibi, alt kabuğun içine düştüğümde otomatik olarak ana kabuğa geri dönüyorum.
sharkant

25

Ctrl+ZDiğer komutlarda basmanın karşılığı budur .

Kabuğu askıya alır ve varsa ana kabuğu veya işlemi kontrol eder.

Örnek:

zsh$ bash
bash-4.4$ cd /
bash-4.4$ suspend
zsh: suspended (signal)  bash
zsh$ fg
[1]  + continued  bash
bash-4.4$ pwd
/

Bu özellik 80'lerin başlarında BSD'nin kabuğu (iş kontrolünün geldiği yer) olan csh'den geliyor .

AT & T'de ksh, bu yerleşik bir takma addır kill -s STOP $$( evet, tırnak işaretleri olmadan! )

Sizin durumunuzda, bashmuhtemelen doğrudan terminal emülatörü tarafından başlatılan kişiydi. Ve terminal emülatörünüz sürecin askıya alınmasını beklemiyordu.

Bu bashbir oturum lideriydi. Oturum lideri askıya alınırsa, eski zaman terminallerinin görüntüsünü alırsak, kullanıcının buna devam etmesi mümkün olmayacaktır.

bashsuspendbir giriş kabuğu olup olmadığını reddederek bu adresleri . Ancak, sizin durumunuzda, terminal emülatörünüz muhtemelen bashoturum açma modunda başlamıyor , bu nedenle koruma sağlanmadı.

zshve mkshproblemi yoktur, çünkü csh gibi (ve SIGTSTPayrıca gönderilen bir Ctrl+Z) sinyalini csh yerine SIGSTOP(ve csh'deki gibi arayanlar için mkshişlem grubuna ve kabuğun ana işlem grubuna zsh, sadece $$işlem için göndermezler) ). SIGTSTPyetim bir süreç grubuna teslim edildiğinde göz ardı edilir ve lider grubu nitelendirilir. Buradaki fikir, SIGTSTP'nin bir kullanıcı tarafından sürdürülemeyen bir şeyi askıya almaması gerektiğidir.

İçinde mkshveya yashbiri, suspendbir alt kabuğun kendisini askıya alması için de kullanılabilir :

$ (set -x; sleep 1; suspend; sleep 2)
+ sleep 1
+ suspend
[1] + Stopped(SIGSTOP)     (set -x; sleep 1; suspend; sleep 2)
$ fg
[1] (set -x; sleep 1; suspend; sleep 2)
+ sleep 2

Bu işe yaramazsa zsh, SIGTSTP'yi arayan yerine ana süreç grubuna gönderir. killYerleşik olan herhangi bir kabukta, kill -s TSTP 0bunun yerine her zaman kullanabilirsiniz .


4
Askıya almanın sık kullanılan bir kullanımından bahsedebilirsiniz: bash (ve muhtemelen çok sayıda mermi): uzun bir emir başlattığınızda ve kesmek istemezsiniz command .... &ancak bunu arka planda yaptınız; unuttum &ve şimdi komutu kesmeden ekleyebilmeyi dilerdim): şunları yapabilirsiniz: ctrl-zve sonra: bgarka planda en son askıya alınmış görevi devam ettirmek için : yazın. (veya bg %ngörev numarasıyla bunu yapmak için kullanılır. Askıya alınan veya çalışan görevlerin bir listesini almak için nkullanın jobs)
Olivier Dulac

5
@OlivierDulac, asıl suspend komutun ne için olduğunu açıklamaz .
Joker
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.