Beni bekletmeden bir emir ver


145

CLI'da bazen yazdığım bir komutun tamamlanması biraz zaman alıyor ve bazen bunun ne zaman olacağını biliyorum. Biraz "arkaplan" ve Linux'ta karıştı.

CLI'ye beklemek istemediğimi söylemenin en yaygın olanı (veya kullanıcı dostu yoludur), lütfen derhal bana geri bildirimde bulunun. Ve bana bir ilerleme çubuğu verebilir ya da sadece meşgul iplikçi verebilirse, bu harika olurdu!


3
Ayrıca bkz. Komut satırı uygulamalarını doğrudan arka plana nasıl gönderirsiniz? komutu zaten başlattıysanız ve arka plana göndermek istiyorsanız.
Gilles,

Yanıtlar:


153

&Komutu çalıştırmadan önce, arka planda çalışacak komut satırına ekleyebilirsiniz :

long-running-command &

Bir komutu başlattıktan sonra, CtrlZaskıya almak ve ardından bgarka planda koymak için tuşuna basabilirsiniz :

long-running-command
[Ctrl+Z]
bg

"Find ~ / a.java &" komutunu kullandım ancak arkaplanda gitmedim mi? Ayrıca, cmd + z (mac için) denedim .... çalışmıyor
Abhimanyu Aryan

1
@AbhimanyuAryan, belki find ...önce komutunuzu hata ayıklamak , sonra arka planda çalıştırın. Bu durumda, eksik -nameseçeneği.
Alexis Wilke

113

Bu, işlemi arka plana göndermek dışında, terminalinizi kirleten metin çıktısı için endişelenmenize gerek yok, çünkü hepsinin favorisi:

nohup command &

Bu işlem sadece arka planda çalışmamakla kalmaz, aynı zamanda bir günlük oluşturur ( nohup.outmevcut dizinde, bu mümkün değilse, ana dizininiz olarak adlandırılır) ve eğer mevcut kabuğu kapatıp / kapatırsanız, işlemin çocuk tarafından alınması önlenerek öldürülmez ebeveyn öldürüldüğü zaman sinyal verir (yani, oturumu iptal, ebeveyne YUKARIŞTURMA veya mevcut kabuğu kapatma).

Aranan başka bir disownşey var , fakat bu kendi başına bir yöntem değil, başka cevapların bir uzantısı.

command & # our program is in background
disown # now it detached itself of the shell, you can do whatever you want

Bu komutlar, işlemi gerçekleştirmek için bir kesin yol kullanmadıkça işlem çıktılarını kolayca kurtarmanıza izin vermez.


4
95'ten beri Sysadmin. Bugüne kadar hiç reddetme duymadım, teşekkürler! Her kabukla çalışmamaktadır (bash, zsh, tcsh. Tcsh çalışmadı).
yoonix

Kullanılması nohupBir iş kontrol kabuğunda saçma. Modern kabukları HUParka plan işlemlerine göndermez . Benzersiz bir dosya adına yönlendirmek, ödenmesi gereken küçük bir bedeldir.
piliçler

@chicks burada kullanım durumunun stderr ve stdout'un terminali kirletmesini artırarak otomatik olarak bir günlük dosyası oluşturmasını engellemektir.
Braiam

1
command > file.log 2>&1 & disownbiraz daha uzun nohup command &ama sanırım @ chicks önerdiği bu.
joeytwiddle

31

Muhtemelen istediğin budur

my_command > output.log 2>&1 &

Bu komut, stdout ve stderr komutlarını belirleyebileceğiniz bazılarına yönlendirerek komutunuza başlar output.log. Çıktıyı hiç saklamakla ilgilenmiyorsanız - /dev/nullgerçek bir dosya yerine kullanabilirsiniz .

&komutu, arka planda yürütür, böylece çalışırken komutları girmeye devam edebilirsiniz. 2>&1stderr'yi stdout'a yönlendirerek tüm çıktıların yakalanmasını sağlar.

ayrıca, böyle bir komut çalıştırdığınızda, buna benzer bir çekirdeğin de bir onayını almanız gerekir: [2] 1234 Bu, işleminizin arka planda çalıştığı ve kimliği olduğu anlamına gelir 1234, böylece isterseniz daha sonra öldürebilirsiniz.kill -9 1234


2
teşekkür ederim, 2>&1çok önemli coz komut başarısız olabilir ve bazı durumlarda hata çıkışı deneyin!
ericn,

1
Bu, yukarıdaki cevaplar teşekkür etmediğinde işe yaradı.
Domagoj

9

İçine bak ekrana veya tmux . Bir örnek tmux:

$ tmux new -d 'longrunningcommand'

Arkaplan için '&' işaretini kullanan diğer cevaplar işe yarayacaktır, ancak stdout'u (ve stderr!) Yönlendirmelisiniz. Bunu yapmadan, çıktı doğruca kabuğunuza gider ve diğer çıktılarınızla karışır.

Arka plan, uzun bir komut çalıştırıyorsanız ve oturumu kapattıysanız veya bağlantınız koparsa da başarısız olur. Sistem işini öldürür.

Ekran veya tmux'u bilmiyorsanız, temel olarak kabuğundan tamamen ayrılmanıza izin verir. Programınızın arka planını değiştirmek yerine tüm kabuğu arka plan olarak kullanırsınız. Daha sonra başka bir bilgisayardan bile geri dönebilirsiniz. Her ikisi de bu kullanım durumunun ötesinde faydalı bulabileceğiniz veya bulamayacağınız bir ton daha özelliğe sahiptir.

Ekran eski denenmiş ve gerçek programdır; tmux çok daha genç ama ekranın geçmişinden öğrendi.


Bu cevap gerçek bir cevabı özlüyor ve bir RTFM gibi geliyor.
Lloeki

5

(Bütünlüğü sağlamak için zaten cevaplanmış :) Komuttan &sonra ekleyerek arka planda bir komut koyarsınız :

long_command with arguments > redirection &

Sorunuzun diğer bölümünü ele almak için bu cevabı ekliyorum:

Devam eden arka plan komutlarını göstermek için döndürücünün gerçek bir karşılığı yoktur, ancak jobsveya komutunu kullanarak arka plan komutlarının durumunu görebilirsiniz jobs -l. Size arka plandaki komutlarınızı ve çalışıyorlar mı, sinyal yoluyla mı durdular (örneğin, ile ^Z) veya ara sıra durup durmadıklarını gösterecekler çünkü sizden etkileşimli girdi bekliyorlar.


long_command with arguments &> redirection &yönlendirmek için stderrçok
Buz Blaze

3

Bir programı kullanarak arka planda çalıştırabilirsiniz &. Örneğin, örneğin çalıştırmak yum install XyZisterseniz, koşabilirsiniz:

yum install XyZ &

Programın stdoutveya çıktısı, >bir dosyanın üzerine yazmak veya >>bir dosyaya eklemek için yönlendirilebilir . Örneğin, yumbir dosyaya giriş yapmak istiyorsanız yum.log:

yum install XyZ > yum.log &

Veya çıktıyı mevcut bir dosyaya eklemek istiyorsanız log:

yum install XyZ >> log &

Hatalar bir dosyaya yazdırılır stderrve yazdırılmaz ve stdoutaynı şekilde bir dosyaya yönlendirilebilir, ancak bunlar şu şekilde kullanılır 2>:

yum install XyZ 2> errors
yum install XyZ 2>> errors

Her ikisini de yönlendirmek istiyorsanız stderrve stdoutkullanabilirsiniz &>:

yum install XyZ &> output
yum install XyZ &>> output

2

Arka planda bir komutu sadece arkasından &işaret koyarak çalıştırabilirsiniz .

Örneğin:

areallylong_command &

arka planda çalışacak.

Stdout / stderr komutunu ayrıca uygun dosyalara yönlendirebilirsiniz, böylece bir şey yaparken terminalinizde görünmezler.

Daha fazla bilgi için buna bakın: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html


0

Uzun süredir devam eden göreve başlamadan önce 'screen' komutunu kullanmayı deneyin, daha sonra ne zaman ayırırsanız tekrar 'screen -r -d' ile tekrar bağlanabilirsiniz. Ssh veya diğer ağ bağlantıları üzerinden bir terminal kullanırken, bazen sunucuya kötü bir bağlantı nedeniyle kopabileceklerini biliyorum. Bir 'ekran' içinde çalışan bu sorunu düzeltir.

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.