“&” Olmadan arka planda işlemler


24

Diyelim ki Linux'ta (bir metin editörü vb. Gibi) yeni bir uygulama başlattınız, ancak “&” yi kullanmayı unuttunuz. Uygulamayı KAPATMAK zorunda değilken, bu işlemin arka planda çalışmasını sağlamak için hangi komutları kullanırdınız? Bu şekilde, hem işlemleri açık hem de ayrı ayrı çalıştırabilirsiniz (örneğin, işlemi oluşturmak için kullandığınız komut satırı terminali ve hala çalışan bir metin düzenleyici gibi işlem).


Teknik olarak değil ama belki de tmuxsorunuzda istenen aynı işlevi verir.
mkc

1
Mümkün olduğunda başka bir kabuk açmanın basit alternatifini gözden kaçırmayın.
jpmc26

Yanıtlar:


43

Terminal penceresinde genellikle işlemi "askıya almak" için Control+ Zyazıp ardından bg"arka plan" komutunu kullanırsınız.

örneğin bir uyku komutu ile

$ /bin/sleep 1000
^Z[1] + Stopped                  /bin/sleep 1000
$ bg
[1]     /bin/sleep 1000&
$ jobs
[1] +  Running                 /bin/sleep 1000
$ 

İşlemin çalıştığını görebiliyoruz ve hala komut satırım var.


5
fgİş kimliğini ( 1bu durumda parantez içinde belirtilir ) parametre olarak alan komutla işlemin ön plana getirilebileceğini eklemek ilginç olabilir . Kullanımına özgü değildir bgve başlatılan işlemlerle yapılabilir &.
Aaron,

14

Ctrl+ Zbunu yapmanın yoludur, fakat sadece bütünlük için: soru "komut" ister ve bu (başka bir terminalden) olur:

kill -STOP pid_of_the_running_applications

ve sonra elbette

bg

uygulama terminalinden.


6
kil -STOP ve sonra öldür -CONT
Michel Billaud

10

Bash'te:

Ctrl+ Zve sonra bg.

Şimdi koş jobsve sonucu gör.


2
@grooveplex Tomas önce cevap verdi, bu yüzden Stephen'ın cevabını aşağıda yorumlamak daha uygun olacaktır, onun temelde daha ayrıntılı olarak verdiği cevaptır.
Anthon,

2
Aslında eşzamanlı cevapladık. Şaşırtıcı değil, ikimiz de aynı şeyi söyledik çünkü açık cevap bu oldu :-) İkimiz de diğerini kopyalamadık. Cevabım Thomas'tan kısa bir süre sonra geldi çünkü ekstra zamanını örnek oluşturmak ve biçimlendirmek için harcadım.
Stephen Harris,

1
Benimki de Bash'de olduğunu söylüyor, yani aynı değiller.
Tomasz

1
Heh, orada potansiyel bir nokta var. Kabuğun iş kontrolüne sahip olmasını gerektirir. Çalıştığım ilk makinelerden bazıları (SVr2 tabanlı) buna sahip değildi /bin/shve bu yüzden bu işe yaramazdı :-)
Stephen Harris

1

CTRL- tuşuna basmanın zorluğunun önleyici bir önlemi olarak, zeditörünüz için arka planda çalışan bir sarmalayıcı komut dosyası yapabilirsiniz. Bu şekilde, arkaplanda açıkça başlatmayı hatırlamaya dikkat etmeniz gerekmez:

    #!/bin/sh

    EDITOR="emacs" # or whatever

    if [ -z "${DISPLAY}" ]; then
      ${EDITOR} "$@"
    else
      ${EDITOR} "$@" &
    fi

Yukarıda, önce X sunucunuz olup olmadığını belirlemeye çalışırız ve sonra editörü arka planda çalıştırırız (değilse, çoğu Unix editörü terminalinizi kullanır ve bu durumda editörü arka plan işlemi olarak çalıştırmak istemezsiniz) . Tüm argümanları "$@"tıpkı sarmalayıcı komut dosyası için sağladığınız gibi , seçtiğiniz edibatim ( ) editörünüze iletir .

Kayıp komut için ... Temel denememe göre, terminal içermeyen GUI programları için, ilk gönderme SIGSTOPve sonra SIGCONTön plan işlemine kadar basit olabilir ( killbunu uygulamak için kabuk komut dosyasını kullanıyorsanız komutu kullanarak ) . Elbette başka bir terminal penceresinde / sekmesinde çalıştırmanız gerekecek ve zorluk, rahatça ve sinyalinizi göndermek istediğiniz PID'yi bulmak için genel bir şekilde olacaktır. Varsayılan olarak iki sinyali verilen adın tüm işlemlerine gönderebilirsiniz (en sevdiğiniz editöre varsayılan olarak ve PID'lerin argüman olarak kullanılmasına izin verme):

    #!/bin/sh

    EDITOR=emacs # whatever

    stop_cont_prog()
    {
      case "$1" in
        # begin with number is considered PID - this is not good 
        # enough to be taken seriously...
        [1-9]*) kill -SIGSTOP "$1"; kill -SIGCONT "$2";;
        *)      killall -SIGSTOP "$1"; killall -SIGCONT "$2";;
      esac
    }

    if [ -n "$1" ]; then
      for prog in "$@"; do stop_cont_prog "$1"; done
    else  
      stop_cont_prog "${EDITOR}"
    fi

Bu yöntem emacs, arka planda (birkaç) komut çalıştırdıktan sonra bana terminal sekmelerimi doğru bir şekilde verdi . Ancak terminalde çalışan emac işlemleri, kabuk işi kontrolü veya terminal ayarı karışıklığından dolayı düzgün şekilde geri yüklenmedi. Dolayısıyla bu yöntem biraz gelişmişlikten faydalanacaktır.

SIGSTOPEğer (ortak varsayılan olarak) basın ön plan işlemine göndermek tam olarak ne olduğunu CTRL- z. stty -aÇıkış bakın

$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]

(çıktı kısaltılmış) ve sttymanuel sayfa:

   susp CHAR
          CHAR will send a terminal stop signal

SIGSTOPSinyal kullanılarak durdurulan işlemler gönderilerek yeniden başlatılabilir SIGCONT. Normalde, dikkate aldığımız SIGCONTdiğer manipülasyonları fgve bgkomutları gönderecek ve ilgilenecek olan kabuk işi kontrol mantığıdır .

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.