Bagaimana cara menghubungkan kembali ke layar yang hilang (terlepas, soket hilang)?

23

Saya memiliki screensesi yang berjalan di server rumah. Workstation saya membutuhkan reboot, jadi saya melepaskan dan membunuh terminal. Setelah terhubung kembali ke server, saya menjalankan tipikal saya

$ screen -D -R
[new screen]

Hah? Tidak, bukan sesi baru, beri yang lama. Saya tahu, saya akan mengambilnya langsung. Apa nama soketnya?

$ screen -list
No Sockets found in /var/run/screen/S-username

$ ls -a /var/run/screen/S-username
.  ..

Tunggu apa? Saya tahu saya membiarkannya berjalan. Kemana perginya?

$ ps -ef | grep -i screen
username  30860     1  0 Oct16 ?        00:00:29 SCREEN

Nah, inilah prosesnya. Tapi tidak ada soket untuk lewat screen -r. Bagaimana saya bisa kembali ke sesi saya?

quack quixote
sumber

Jawaban:

28

Screenmemeriksa fifo / socket setiap kali menerima SIGCHLDsinyal. Jika soket tidak ada, ia akan diciptakan kembali. Jadi solusinya adalah menemukan proses dan mengirimkannya SIGCHLD.

Di sistem Debian saya, screentampaknya diinstal sebagai setgid utmptetapi tidak setuid, jadi solusi pertama dari FAQ di bawah ini berfungsi:

$ kill -CHLD 30860
$ ls /var/run/screen/S-username/
30860.pts-4.localhost

Pada sistem di mana layar diinstal setuid root, ini tidak akan bekerja, dan Anda harus membunuh salah satu proses anak dari sesi layar aktif untuk memaksa kernel mengirimkan sinyal untuk Anda. Ini berarti mengorbankan salah satu jendela layar Anda untuk terhubung kembali dengan yang lain (pilih dengan bijak!).

Dari FAQ Wiki Gentoo yang diarsipkan :

Soket Tidak Ada

Terkadang soket dari layar yang masih berjalan dapat dihancurkan, meskipun proses aktual dan semua proses anaknya masih berjalan. layar-daftar akan menampilkan "Tidak Ada Soket yang ditemukan di / tmp / uscreens / .." Beberapa petunjuk praktis untuk memulihkan dari ini (dan beberapa masalah tidak umum lainnya) di http://www4.informatik.uni-erlangen.de/ ~ jnweiger / screen-faq.html # MISC sekitar 2/3 dari jalan turun.

T: Untuk beberapa alasan yang tidak diketahui, fifo di / tmp / screens / S-myname hilang, dan saya tidak bisa melanjutkan sesi layar saya. Apakah ada cara untuk membuat ulang fifo?

A: Layar memeriksa fifo / socket setiap kali ia menerima sinyal SIGCHLD. Jika hilang, fifo / socket diciptakan kembali kemudian.

Jika layar berjalan non-setel , pengguna dapat mengeluarkan secara kill -CHLD screenpidlangsung (ini -CHILDpada beberapa sistem). Screenpid adalah id proses dari proses layar yang ditemukan dalam ps -xdaftar.

Tetapi biasanya ini tidak akan berhasil, karena layar harus diinstal setuid root. Dalam hal ini Anda tidak akan dapat mengirim sinyal, tetapi kernel akan melakukannya. Ia melakukannya, setiap kali anak layar mengubah kondisinya. Temukan id proses (shellpid di bawah) dari shell "paling tidak penting" yang berjalan di dalam layar. Mencoba kill -STOP shellpid. Jika fifo / socket tidak muncul kembali, hancurkan proses shell. Anda mengorbankan satu shell untuk menyimpan sisanya. Jika tidak ada yang berhasil, jangan lupa untuk menghapus semua proses yang berjalan di sesi layar yang hilang.

quack quixote
sumber