Bagaimana cara mendaftar sesi layar berjalan?

233

Saya memiliki banyak server, tempat saya menjalankan eksperimen menggunakan screen. Prosedurnya adalah sebagai berikut:

  1. ssh ke server XXX
  2. meluncurkan screen
  3. mulai eksperimen dalam beberapa tab
  4. melepaskan screen
  5. putuskan sambungan dari server

Sementara percobaan sedang berjalan, saya dapat dengan mudah menemukan di server mana mereka berada dengan masuk sshke semua server dan mendaftar proses saya yang sedang berjalan (menggunakan topatau ps).

Namun, setelah percobaan selesai, bagaimana saya bisa menemukan di server mana saya memiliki sesi layar dibuka (sehingga saya dapat melihat output, meluncurkan kembali, dll)?

PS: Eksperimen saya juga mencetak output mereka ke file ... tapi ini bukan poin dari pertanyaan saya.

Wookai
sumber

Jawaban:

420

Untuk daftar semua sesi layar untuk pengguna, jalankan perintah berikut sebagai pengguna itu:

screen -ls

Untuk melihat semua sesi layar pada mesin tertentu yang dapat Anda lakukan:

ls -laR /var/run/screen/

Saya mendapatkan ini di mesin saya:

gentle ~ # ls -laR /var/run/screen/

/var/run/screen/:
total 1
drwxrwxr-x  4 root utmp   96 Mar  1  2005 .
drwxr-xr-x 10 root root  840 Feb  1 03:10 ..
drwx------  2 josh users  88 Jan 13 11:33 S-josh
drwx------  2 root root   48 Feb 11 10:50 S-root

/var/run/screen/S-josh:
total 0
drwx------ 2 josh users 88 Jan 13 11:33 .
drwxrwxr-x 4 root utmp  96 Mar  1  2005 ..
prwx------ 1 josh users  0 Feb 11 10:41 12931.pts-0.gentle

/var/run/screen/S-root:
total 0
drwx------ 2 root root 48 Feb 11 10:50 .
drwxrwxr-x 4 root utmp 96 Mar  1  2005 ..

Ini adalah penggunaan Unixy Socket yang agak cemerlang yang dibungkus dengan izin sistem berkas untuk menangani keamanan, keadaan, dan aliran.

Joshperry
sumber
1
Saya bertanya-tanya mengapa jawaban ini, yang menjawab pertanyaan dengan sempurna, mendapat downvote ...
Blaszard
Atau jika Anda ingin mendapatkan layar tertentu berdasarkan konvensi penamaan, Anda dapat melihat hasilnya. ls -R /var/run/screen/S-root/ | grep "NamingConvention". Layar simpan dalam <pid>.<screen_name>format. Ini berguna untuk skrip bash. Jadi, jika Anda memiliki layar dengan nama, 0000.NamingConventionitu benar-benar hanya akan mengembalikan nama layar yang Anda cari dalam format yang mudah diurai.
Elias Ranz
19

Perintah layar -list mungkin apa yang Anda inginkan.

Lihat pria itu

Sakit kepala
sumber
13

Sementara jawaban joshperry benar, saya merasa sangat menjengkelkan karena tidak memberi tahu Anda nama layar (yang Anda atur dengan opsi -t), itu sebenarnya yang Anda gunakan untuk mengidentifikasi sesi. (Bukan salahnya, tentu saja, itu cacat layar)

Itu sebabnya saya malah menggunakan skrip seperti ini: ps auxw|grep -i screen|grep -v grep

o0 '.
sumber
2
Lihatlah opsi -S. Nilai yang diberikan disimpan dalam nama file soket unix dan terlihat dalam lsoutput. Jika perlu, Anda dapat menyimpan opsi -t juga.
joshperry
Opsi -S bagus, karena juga memungkinkan Anda melanjutkan dengan nama sesi:screen -rd <sessionname>
jorisw
7

Saya tidak terlalu yakin dengan pertanyaan Anda, tetapi jika yang Anda inginkan adalah daftar sesi layar yang sedang dibuka, coba:

screen -ls
skinp
sumber
6
 For windows system

 Open putty 
 then login in server

Jika Anda ingin melihat layar di Konsol maka Anda harus menulis perintah

 Screen -ls

jika Anda harus mengakses layar maka Anda harus menggunakan perintah di bawah ini

 screen -x screen id

Tulis PWDdi baris perintah untuk memeriksa di folder mana Anda saat ini

Ankit jain
sumber
3

Dalam kebanyakan kasus screen -RRx $username/wasiat sudah mencukupi :)

Jika Anda masih ingin membuat daftar semua layar maka letakkan skrip berikut di jalur Anda dan sebut layar itu atau apa pun yang Anda suka:

#!/bin/bash
if [[ "$1" != "-ls-all" ]]; then
    exec /usr/bin/screen "$@"
else
    shopt -s nullglob
    screens=(/var/run/screen/S-*/*)
    if (( ${#screens[@]} == 0 )); then
        echo "no screen session found in /var/run/screen"
    else
        echo "${screens[@]#*S-}"
    fi
fi

Ini akan berperilaku persis seperti layar kecuali untuk menampilkan semua sesi layar, ketika memberikan opsi -l-all sebagai parameter pertama.

ObiWahn
sumber
3

Banyak orang sudah menunjukkan itu

$ screen -ls

akan daftar sesi layar.

Berikut ini trik lain yang mungkin bermanfaat bagi Anda.

Jika Anda menambahkan perintah berikut sebagai baris terakhir dalam file .bashrc Anda di server xxx, maka itu akan secara otomatis menyambung kembali ke sesi layar Anda saat login.

screen -d -r

Semoga bermanfaat.

samurai
sumber
1
Saya ingin mencatat bahwa Anda harus masuk sebagai pengguna yang sama yang memulai layar, saya khawatir sesi layar saya hilang, tetapi salinan file saya terus di bawah "media" pengguna. Ini mungkin terdengar logis, tetapi bisa menyimpan kepanikan jika Anda mengawasinya.
Paul
0

ps x | ambil LAYAR

untuk melihat layar apa yang berjalan jika Anda menggunakan perintah

layar -A -m -d php make_something.php

dunia didekodekan
sumber
-4

Jadi, Anda menggunakan layar untuk menjaga eksperimen tetap berjalan di latar belakang, atau apa? Jika demikian, mengapa tidak memulainya saja di latar belakang?

./experiment &

Dan jika Anda bertanya bagaimana cara mendapatkan pemberitahuan tentang pekerjaan yang saya lakukan, bagaimana dengan merangkai eksperimen bersama dengan perintah email?

./experiment && echo "the deed is done" | mail youruser@yourlocalworkstation -s "job on server $HOSTNAME is done"
JosefAssad
sumber
Saya menggunakan layar sehingga saya dapat memutuskan sambungan dari server tanpa menghentikan percobaan saya. Pertanyaannya bukan bagaimana cara mendapatkan notifikasi (walaupun surat itu bisa menjadi cara yang baik untuk melakukannya), tetapi bagaimana menemukan apakah mesin yang diberikan memiliki sesi layar terbuka. Terima kasih atas jawaban Anda!
Wookai
Saya bukan sysadmin yang berpengalaman, tetapi saya menemukan menggunakan layar untuk menjalankan proses server berfungsi dengan baik: jika terjadi kesalahan, Anda bisa mengibaskan ke jendela itu, dan melihat semua output yang menyebabkan masalah - Anda tidak perlu mulai membuka file log. Ini juga berarti Anda dapat dengan mudah mematikan proses dengan ctrl + c. Ini semua berguna jika Anda sering memulai dan mematikan layanan yang sama.
Steve Bennett