Çıktıyı bir günlük dosyasına yönlendirebilir ve aynı anda bir işlemi arka planda yapabilir miyim?


116

Çıktıyı bir günlük dosyasına yönlendirebilir ve aynı anda bir işlemi arka planda yapabilir miyim?

Başka bir deyişle, böyle bir şey yapabilir miyim?

nohup java -jar myProgram.jar 2>&1 > output.log &

Yoksa bu yasal bir emir değil mi? Veya, arka planda olduğu gibi manuel olarak da taşımam gerekiyor mu:

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1

2
Bunu denediniz mi? Hangi hatayı alıyorsun? Ayrıca bir yazım hatası veya kodunuzda bir hata olup olmadığından emin değilim. 2>$1muhtemelen olması gerekiyordu 2>&1.
Patrick,

Yanıtlar:


171

İlk komutunuzla ilgili bir sorun stderr'i stdout'un bulunduğu yere yönlendirmenizdir (eğer $ 'ı yorumda önerildiği şekilde değiştirdiyseniz), ve sonra stdout'u bir günlük dosyasına yönlendirdiniz, ancak bu, yönlendirilen stderr'i çekmiyor. . Bunu diğer sıraya göre yapmalısınız, önce gitmesini istediğiniz yere stdout gönderin, sonra stderr adresini adresindeki stderr'e gönderin.

some_cmd > some_file 2>&1 &

ve sonra arka plana göndermek için & üzerine atabilirsin. İşlere jobskomutla erişilebilir . jobssize çalışan işleri gösterecek ve numaralandıracaktır. Daha sonra% gibi bir sayı kullanarak işler hakkında konuşabilirsiniz kill %1.

Ayrıca & ucunda olmadan komutu ile askıya alabilirsiniz , arka planda koymak ve ön plana geri getirmek Ctrlziçin bgkomutu kullanın fg. Komutla birlikte jobs, bu güçlü.

Yukarıdaki kısmı komutları yazdığınız sıra ile açıklığa kavuşturmak için. Varsayalım şekilde hataları stdout'u adresi 1001, adres 1002 ve dosya komut soldan sağa okur 1008, bu nedenle ilk şey sizindir görür 2>&1o zaman görür, adres 1001 Stderr hareket ettiği > file, 1008 stdout'u hareket ettiği ancak stderr'i 1001'de tutar. 1001'de işaret eden her şeyi çekmez ve 1008'e taşır, ancak sadece stdout'a başvurur ve dosyaya taşır.
Bunun tersi şekilde, stdout'u 1008'e, ardından stderr'i de stdout'un işaret ettiği noktaya, 1008'e taşır. Bu şekilde ikisi de tek dosyaya işaret edebilir.


bununla rağmen $!
pid'i yakalayamıyor gibiyim

8
Ayrıca kayda değer: &> file.outstdin ve stdout 2>&1komutlarını bir komut dosyasına yönlendirmek için kullanabilirsiniz .
Dan

14

İle <Ctrl+Z>arka planda durup devam bgetmek &, komutun sonunda çalıştırılmakla eşdeğerdir .

Yani, arka planda çalıştırmak ve çıkışı yönlendirmek için:

java -jar myProgram.jar 2> errorOutput.log > output.log &

Ayrıca terminalden ayrıldığınızda bu komutun ölmemesi gerekiyorsa, kullanmanız gerekir. nohup


Ah anlıyorum. Eklenen '&' karakterinin gereksiz olduğunu mu söylüyorsunuz?
djangofan

Ben sadece manpage alıntı. Nohup komutunu arka planda da çalıştıracağından, nohup komutunu arka planda yürütmesi gereksiz görünüyor
RSFalcon7

10
nohup komutu arka planda çalıştırmaz, açıkça eklemek zorundasınızdır&
jlliagre

3
Bir işlemi arka plana taşıdıktan sonra, çalışarak bgoturumunuzdan disown, terminali kapattığınızda işlemin ölmemesini sağlayan oturumunuzdan çıkarabilirsiniz .
Koen.

14
java -jar myProgram.jar &> output.log &

&>Stdout ve stderr komutlarını output.log dosyasına yönlendirdiğini unutmayın.


3
Tek satırlı bir açıklama cevabı tamamlayacaktır.
anaik

2
@ abhisheknaik96 jar dosyasını çalıştırır ve hem stdin hem de stderr'i output.log dosyasına yönlendirir ve arkaplan işlemini yapar.
P Pang

2

Nohup kullanmak yerine ekranı kullanabilirsiniz. Programın durumunu gerçek zamanlı olarak görüntüleyebilirsiniz. Hatta tüm çıktıları bir dosyaya kaydedebilirsiniz. Sunucuya, zayıf bağlantı veya etkinlik dışı kalma nedeniyle oturumu kapattığınız ssh ile eriştiğinizde faydalıdır. Giriş yaptıktan sonra çalışmaya kaldığınız yerden devam edebilirsiniz. detaylı olarak bilmek için bu ve bu bakın .


1

teeKomut de oldukça yaygındır.

nohup java -jar myProgram.jar | tee output.log &

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.