Jalankan (GNU) Layar dari skrip

11

Saya ingin meluncurkan beberapa aplikasi di dalam sesi layar tetapi dari skrip.
Tanpa skrip saya hanya akan meluncurkan layar, kemudian buka N windows dengan crtl-ac dan jalankan program di setiap windows.

Saya mencoba yang berikut ini

screen -d -m -S test
screen -S test -X exec tail -f /var/log/messages
screen -S test -X screen
screen -S test -X exec tail -f /var/log/xinetd.log

Tapi ketika saya pasang, sesi tail tidak berjalan. Jika saya melampirkan sesi setelah screen -d -m -S startupdan lari screen -S startup -X exec tail -f /var/log/messagesdari terminal lain, itu berhasil.

Apakah saya melewatkan sesuatu?

Edit setelah jawaban AlexD:

Solusi setengah bekerja adalah

screen -d -m -S test tail -f /var/log/messages
screen -S test -X screen tail -f /var/log/xinetd.log

Perintah chaining screen (yang setelah -X) dengan perintah ini bekerja sementara exec tidak mungkin karena exec mengharapkan jendela saat ini akan didefinisikan sementara tidak ada saat ini ketika layar terlepas. Terima kasih kepada AlexD untuk tips ini.

Tetapi ada efek samping yang aneh: ketika program berhenti (jika Anda melampirkan sesi layar dan crtl-c ekor, atau membunuh ekor) jendela layar akan menutup.
Jadi perilakunya tidak sama dengan Crtl-A c dan jalankan perintah
Efek samping lainnya adalah Anda tidak dapat mengaitkan 2 perintah

radius
sumber
screen selalu berakhir ketika perintah yang diluncurkan berakhir - itu adalah fitur normal dari alat :) ..jadi jika Anda menjalankan screen top, ketika Anda berhenti top, screenakan berhenti juga
warren
Ya saya sekarang itu, ini sebabnya saya mencoba meluncurkan layar sebagai deamon kemudian gunakan exec kemudian gunakan perintah layar untuk membuka jendela baru (lauching a shell). Saya juga mencoba tu pr bash bash antara exec dan tail atau antara layar dan katakan tetapi tidak ada yang bekerja
radius

Jawaban:

14

The screen -S test -X screen commandPerintah adalah apa yang Anda perlu menambahkan jendela untuk sesi daemon Anda, tetapi tidak untuk alasan yang Anda berikan. Ini bekerja karena -X mengambil perintah layar dan bukan perintah shell, dan perintah layar untuk membuat jendela disebut, membingungkan, layar. Tidak ada perintah layar exec. Tidak ada chaining juga, kecuali jika Anda membangun perintah Anda menggunakan skrip shell (seperti ini screen -S script -X screen sh -c 'command1; command2;':).

Memanggil screen -S test -X screentanpa perintah tidak ada gunanya karena perintah default adalah shell, dan sekali Anda telah menghasilkan shell, Anda tidak memiliki cara noninteraktif (dan tidak licik) untuk menjalankan perintah di dalam shell itu. Lebih baik menjalankan perintah itu sendiri, tanpa shell interaktif. Efek sampingnya adalah ketika perintah keluar, jendela layar tidak lagi memiliki anak, dan akan ditutup.

Sekarang, Anda dapat meminta layar untuk menahan jendela tetap terbuka, setelah perintah berhenti. Gunakan zombieperintah layar untuk mengaktifkannya. Urutan Anda terlihat seperti:

screen -d -m -S script
screen -S script -X zombie qr
screen -S script -X screen tail -f /var/log/messages
screen -S script -X screen tail -f /var/log/xinetd.log

Untuk memasang kembali secara interaktif:

screen -S script -r

Dan akhirnya, Anda dapat menulis ulang perintah -X ini sebagai skrip screenrc.

Screenrc:

zombie qr
screen tail -f /var/log/messages
screen tail -f /var/log/xinetd.log

Naskah:

screen -d -m -S script -c screenrc
Tobu
sumber
Ya saya tahu bahwa -X mengambil perintah layar, yang saya maksud ketika saya mengatakan "Perintah layar chaining (yang setelah -X)" (Ok tidak jelas sama sekali) tetapi ada perintah layar exec, lihat pria itu halaman, tetapi seperti yang Anda katakan tidak ada cara untuk membuatnya berfungsi seperti yang diinginkan dalam mode noninteraktif. Pokoknya dengan solusi AlexD dan Anda perintah zombie menambahkan saya mendapatkan apa yang saya inginkan! Terima kasih
radius
@Tobu: +200 untuk menyebut zombie! Saya pada akhirnya tidak akan pernah melihatnya dalam buku pedoman yang mengerikan itu!
tanaman merambat
6

Jika Anda ingin efek yang sama Ctrl-A cmaka Anda harus menggunakan screendaripada exec:

layar -S uji -X layar ekor -f / var / log / pesan
layar -S uji -X layar
layar -S uji -X layar ekor -f /var/log/xinetd.log

Selain itu, Anda dapat memindahkan perintah di atas ke $HOME/.screenrc-younameitfile (tanpa screen -S test -Xawalan) dan meluncurkan screen -c $HOME/.screenrc-younameitketika Anda ingin membuat sesi layar tertentu.

AlexD
sumber
Ctrl-A c berada di baris ke-3 saya, saya kira exec tidak berfungsi karena exec menjalankan perintah di windows saat ini yang mungkin tidak ditentukan ketika layar terlepas. Layar chaining solusi Anda dan perintahnya bagus, saya harus mencobanya! Saya akan menambahkan jawaban untuk diri saya sendiri karena jawaban Anda tidak memiliki pembuatan sesi dan memiliki garis yang tidak berguna (yang ke-2, melompati 1 jendela)
radius
Bahkan itu tidak berfungsi seperti yang diharapkan, windows tutup segera setelah program berhenti. jika Anda melakukan layar -S uji -X layar ls, jendela akan menutup dan Anda tidak akan pernah melihat hasilnya
radius
1

menggunakan byobu sebuah opsi?

Sirex
sumber
Saya baru saja mencobanya, saya tidak melihat bagaimana itu bisa membantu tetapi jika Anda memiliki solusi yang berfungsi dengan byobu itu bisa ok, saya lebih suka solusi hanya layar tetapi menggunakan add on lebih baik daripada tidak memiliki solusi!
radius
1

Saya melakukan hal yang sama malam ini, saya ingin membuka layar dengan beberapa file yang sudah dibuka. Butuh beberapa saat untuk memikirkan semua ini, tetapi akhirnya saya menemukan yang berikut ini yang tampaknya bekerja dengan sangat baik:


#1/bin/sh 
screen -d -m -S CS140 
screen -S CS140 -X screen -t thread.c 
screen -p 1 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.c\015"'
screen -S CS140 -X screen -t thread.h 
screen -p 2 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.h\015"'
screen -S CS140 -X screen -t palloc.c 
screen -p 3 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/palloc.c\015"'
screen -S CS140 -X screen -t intr-stubs.h 
screen -p 4 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/intr-stubs.h\015"'
screen -S CS140 -X screen -t pagedir.c 
screen -p 5 -S CS140 -X eval 'stuff "vim cs140-ps2/src/userprog/pagedir.c\015"'
screen -r -d CS140 

Ini akan membuat enam layar berbeda, dengan layar 1-5 membuka berbagai file. Saya tidak tahu semua hal spesifik tetapi 'barang' pada dasarnya memberitahu layar teks yang dikutip berikut ini bukan perintah layar. The 'eval' kemudian evlautes semua yang terkandung dalam kutipan. Tanpa ini, screen -p 4 -S CS140 -X stuff "vim cs140-ps2/src/threads/intr-stubs.h\015" hanya pipa teks yang dikutip tanpa menjalankannya. Eval akan membaca '\ 015' sebagai baris baru dan dengan demikian mengeksekusi teks sebelumnya.

Dalam hal detail lainnya, screen -p 1 -S CS140 -X CMD beri tahu shell untuk mengirim 'CMD' ke jendela pertama sesi layar bernama 'CS140'.

Semoga itu bisa membantu!

DevonH
sumber