Ekranı (program) çıktısını bir dosyaya Kaydet


130

Daha sonra tüm içeriği kontrol etmek için Screen çıktısının tamamını bir dosyaya kaydetmem gerekiyor .

Bunun nedeni, bir seri bağlantı noktasından bir flash belleği boşaltmam, Ekran ile arayüz oluşturmam. Bellek yapısını kontrol etmek için onu bir dosyaya kaydetmek istiyorum.

Denedim:

$: screen /dev/ttyUSB0 115200 >> foo.txt
$: screen /dev/ttyUSB0 115200 | tee foo.txt

Ayrıca ekrandan bufferfile kullanmayı denedim ama nasıl kullanacağımı anlamıyorum.

kolay bir yolu var mı?


Kullandığım üretim ayarında birden çok ekran örneği var. Çıktısına ihtiyacım olanın 'pts / 10' satırı var. Dolayısıyla çıktısını bir dosyaya almak için ne yapmalıyım?
Sid

Yanıtlar:


130

Günlük kaydı için bir komut satırı seçeneği vardır. Çıktı, screenlog.n dosyasına kaydedilir; burada n, ekranın bir numarasıdır. Ekranın man sayfalarından:

'-L' Ekrana pencereler için otomatik çıktı günlüğünü açmasını söyleyin.


6
Teşekkürler. Hangi ekranın çıktı tamponunda zaten bulunduğunu çıktılamanın bir yolu var mı? Örneğin, günlüğe kaydetmeyi etkinleştirmeyi unuttum, ancak çıktı kaydırma ekranı arabelleğinde mevcut - bunu bir dosyaya nasıl yazabilirim?
Tagar

48
Sadece biraz daha google'da arama yaptım .. İşte benim açıklamamın cevabı - stackoverflow.com/questions/4807474/… Ctrl + A ve: komut moduna geçmek için, başka birinin buna ihtiyaç duyması durumunda -h <dosya adı> 'nı yazdırın.
Tagar

3
Günlük dosyası, ekranı çalıştırdığınız aynı dizinde oluşturulacaktır.
lepe

1
Dün bir "screen -L" yaptım, SSH oturumumun bağlantısını kestim, bugün tekrar oturum açtım ve "screen -r" kullanarak yeniden bağlandım (sadece bir tane vardı), çıktım ve find / -name "screen*log"hiçbir şey bulamadım.
pacoverflow


104

Günlükleri screenlog.n dosyasına kaydetmek için Control-a + H'yi de kullanabilirsiniz. Kapatmak için bir tane daha Control-a + H.

Ca H: Geçerli pencerenin "screenlog.n" dosyasına kaydedilmesini başlatır / bitirir.


5
+1. Günlük oluşturulamıyorsa, ekran penceresinin çalışma dizinini değiştirmeyi deneyin: Ctrl- a+ :ve örneğinchdir /home/foobar/baz
Chriki

2
Ca + H sadece benim için ekran pencerelerini değiştiriyor. Günlük dosyasıyla ilgisi yok!
aaa90210

2
@ aaa90210 Basılı kopya için ctrl-a ve ardından ayrı bir h tuşuna basın. ctrl-a ve ardından ayrı bir shift-h tuşuna basma, tam bir günlük dosyası başlatır.
James

1
Ctrl-a H ile oluşturulan screenlog.0 dosyasını mı arıyorsunuz? unix.stackexchange.com/questions/198881/…
straville

20

Seçilen yanıt, birden çok oturumda pek iyi çalışmıyor ve özel bir günlük dosyası adı belirtmeye izin vermiyor.

Birden çok ekran oturumu için formülüm şudur:

  1. Her işlem için bir yapılandırma dosyası oluşturun:

    logfile test.log
    logfile flush 1
    log on
    logtstamp after 1
    logtstamp string "[ %t: %Y-%m-%d %c:%s ]\012"
    logtstamp on
    

    "Anında" yapmak istiyorsanız, logfileotomatik olarak değiştirebilirsiniz . \012"yeni satır" anlamına gelir, çünkü kullanmak \nonu günlük dosyasına yazdıracaktır: kaynak .

  2. Komutunuzu "-c" ve "-L" bayraklarıyla başlatın:

    screen -c ./test.conf -dmSL 'Test' ./test.pl
    

    Bu kadar. İlk yıkamadan sonra "test.log" göreceksiniz:

    ...
    6 Something is happening...
    [ test.pl: 2016-06-01 13:02:53 ]
    7 Something else...
    [ test.pl: 2016-06-01 13:02:54 ]
    8 Nothing here
    [ test.pl: 2016-06-01 13:02:55 ]
    9 Something is happening...
    [ test.pl: 2016-06-01 13:02:56 ]
    10 Something else...
    [ test.pl: 2016-06-01 13:02:57 ]
    11 Nothing here
    [ test.pl: 2016-06-01 13:02:58 ]
    ...
    

Yapılandırma dosyasında "oturum aç" olsa bile "-L" nin hala gerekli olduğunu buldum.

Ekran tarafından kullanılan zaman biçimi değişkenlerinin (% m gibi) bir listesini bulamadım. Bu formatların bir bağlantınız varsa, lütfen aşağıya gönderin.

Ekstra

"Anında" yapmak istemeniz durumunda, şu komut dosyasını kullanabilirsiniz:

#!/bin/bash
if [[ $2 == "" ]]; then
    echo "Usage: $0 name command";
    exit 1;
fi
name=$1
command=$2
path="/var/log";
config="logfile ${path}/${name}.log
logfile flush 1
log on
logtstamp after 1
logtstamp string \"[ %t: %Y-%m-%d %c:%s ]\012\"
logtstamp on";
echo "$config" > /tmp/log.conf
screen -c /tmp/log.conf -dmSL "$name" $command
rm /tmp/log.conf

Kullanmak için kaydedin (screen.sh) ve + x izinlerini ayarlayın:

./screen.sh TEST ./test.pl

... ve ./test.pl dosyasını çalıştıracak ve /var/log/TEST.log'da bir günlük dosyası oluşturacaktır.


1
Teşekkürler - bu on-the-flykısım çok kullanışlı.
Ram RS

1
Takibi, yaratılan ve anında silinen bir yapılandırma dosyası ile ilgili bir ekran çalıştırmak gecede üzerinde hata bildiren screen -rile "Unable to open "/tmp/log.conf". Ayrıca, ekran [detached]durumdan yokluğa gitti . Sorun ne olabilirdi?
Ram RS

1
Emriniz ne işe yarar? ekran eksik olduğunda günlük dosyasını yeniden oluşturacak, bu yüzden / tmp / alan kalmadı veya işletim sistemiyle ilgili başka bir sorun yaşadım mı? Bu yaklaşımı süresiz çalışan birkaç sunucuda kullanıyorum ve şu ana kadar en az 1 yıldır böyle bir durum görmedim. İsterseniz bir sohbet başlatabiliriz ve sorununuzu gidermenize yardımcı olabilirim.
lepe

1
Sana yürütme aynıdır işlemi bu şekilde, çalıştırıyorsanız hiçbir ekranı sonlandırmak gerekir, doğru olduğunu düşünüyorum: screen bash. Başka herhangi bir işlem ekranınızı öldürüyorsa, ekran 'ölü' olarak listelenmeli, ancak kaybolmamalıdır. Ne olabileceğinden emin değilim.
lepe

1
@ qräbnö: Güzel yakalayış! Bunca zaman ve fark etmedim. Cevabı buna göre güncelledim.
lepe

20

Aşağıdaki komut Ekran sürümü 4.06.02 için çalışır:

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

Gönderen Ekran adamı sayfası :

-Logfile file : By default logfile name is "screenlog.0".
                You can set new logfile name with the "-Logfile" option.

Sen varolan sürümünü kontrol edebilirsiniz Ekran kullanarak ekran -version . En son Screen sürümünü https://www.gnu.org/software/screen/ adresinden indirip yükleyebilirsiniz .



Ekranın çalışma dizinine yazma izinlerine sahip olmayı unutmayın, çünkü aksi takdirde sessizce başarısız olur (sadece herhangi bir uyarı olmadan oturum
açmaz

15

Mac terminali için:

script -a -t 0 out.txt screen /dev/ttyUSB0 115200

ayrıntılar

  • script: "Terminal oturumunun tipkriptini yapmak" için yerleşik bir uygulama
  • -a: Çıktı dosyasına ekle
  • -t 0: Çıktı dosyasına yazma arasındaki süre 0 saniyedir, bu nedenle out.txt her yeni karakter için güncellenir
  • out.txt: Sadece çıktı dosyası adıdır
  • screen /dev/ttyUSB0 115200: Harici bir cihaza bağlanmak için sorudan gelen komut

Daha sonra kullanabilirsiniz kuyruk dosyası güncelleme olduğunu görmek için.

tail -100 out.txt

1
Bu benim için Mac'te işe yaramadı. Günlük dosyası, ortak olanı ve biten komutu başlatan komut dosyasını gösterir, ancak ekran komutundan alınan verileri göstermez.
David

10

Ctrl+Asonra Shift+Hbenim için çalışıyor. Dosyayı screenlog.0program çalışırken görüntüleyebilirsiniz.


1
Ctrl + A sonra H.
Shimon Doodkin

1
@ShimonDoodkin Bunu denedim, nedense Debian'da çalışmıyor. Yine de başkalarına yardımcı olabilir. Teşekkürler!
jaggedsoft


5

İşte bir numara: sarın sh -c!

screen sh -c './some-script 2>&1 | tee mylog.log'

2>&1Stderr'i stdout'a yönlendirdiği yerde teehata mesajlarını yakalayabilir ve kaydedebilir.


5

Aşağıdakiler yararlı olabilir (üzerinde test edilmiştir: Linux / Ubuntu 12.04 (Hassas Pangolin)):

cat /dev/ttyUSB0

Yukarıdakileri kullanarak, ihtiyacınız olan tüm yeniden yönlendirmeleri yapabilirsiniz. Örneğin, dosyanıza kaydederken çıktıyı konsolunuza dökmek için şunları yaparsınız:

cat /dev/ttyUSB0 | tee console.log

Bu benim için mükemmel çalıştı. Bir Arduino veri yakalama oturumundan seri monitör çıkışını kaydediyorum.
Ian Pitts

3

Tüm geri kaydırma arabelleğinizin çıktısını zaten aktif olarak çalışan bir ekrandan kaydetmeniz gerekirse farklı bir yanıt:

Ctrl-a [ g SPACE G $ >.

Bu, tüm tamponunuzu / tmp / ekran değişimine kaydedecektir.


2

Mevcut ekran günlüğü şu şekilde kaydedilebilir:

Ctrl+A : basılı -h dosya adı

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.