เรียกใช้หน้าจอ (GNU) จากสคริปต์


11

ฉันต้องการเปิดแอปพลิเคชั่นภายในเซสชันหน้าจอ แต่มาจากสคริปต์
หากไม่มีสคริปต์ฉันก็แค่เปิดหน้าจอแล้วเปิด N windows ด้วย crtl-ac และรันโปรแกรมในแต่ละหน้าต่าง

ฉันพยายามต่อไปนี้

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

แต่เมื่อฉันแนบเซสชันหางไม่ทำงาน ถ้าฉันแนบเซสชันหลังจากนั้นscreen -d -m -S startupและเรียกใช้screen -S startup -X exec tail -f /var/log/messagesจากเทอร์มินัลอื่นมันใช้งานได้

ฉันพลาดอะไรไปหรือเปล่า?

แก้ไขหลังจากตอบ AlexD:

วิธีแก้ปัญหาการทำงานครึ่งหนึ่งคือ

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

คำสั่งหน้าจอ Chaining (หนึ่งหลัง -X) กับคำสั่งทำงานในขณะที่ exec ไม่น่าจะเป็นเพราะ exec คาดว่าหน้าต่างปัจจุบันจะถูกกำหนดในขณะที่ไม่มีหนึ่งในปัจจุบันเมื่อหน้าจอจะถูกถอดออก ขอบคุณAlexDสำหรับเคล็ดลับนี้

แต่มีผลข้างเคียงที่แปลกคือเมื่อโปรแกรมหยุด (ถ้าคุณแนบเซสชันของหน้าจอและ crtl-c tail หรือ kill tail) หน้าต่างหน้าจอจะปิดลง
ดังนั้นพฤติกรรมจึงไม่เหมือนกับ Crtl-A c และเรียกใช้คำสั่ง
ผลข้างเคียงอื่นคือคุณไม่สามารถโยงคำสั่ง 2 ได้


screen มักจะสิ้นสุดลงเมื่อคำสั่งด้วยซึ่งจะได้รับการเปิดตัวปลาย - มันเป็นคุณลักษณะปกติของเครื่องมือ :) ..so ถ้าคุณทำงานscreen topเมื่อคุณเลิกtop, screenจะเลิกเกินไป
วอร์เรน

ใช่ฉันเป็นเช่นนั้นนี่คือเหตุผลที่ฉันลองเปิดหน้าจอเป็น deamon จากนั้นใช้ exec จากนั้นใช้คำสั่งหน้าจอเพื่อเปิดหน้าต่างใหม่ (lauching a shell) ฉันยังลอง tu prepend bash ระหว่าง exec และ tail หรือระหว่างหน้าจอและบอก แต่ก็ไม่ทำงาน
รัศมี

คำตอบ:


14

screen -S test -X screen commandคำสั่งคือสิ่งที่คุณจำเป็นต้องเพิ่มหน้าต่างที่จะเซสชั่นภูตของคุณ แต่ไม่ได้สำหรับเหตุผลที่คุณให้ มันทำงานได้เพราะ -X ใช้คำสั่งหน้าจอไม่ใช่คำสั่งเชลล์และคำสั่งหน้าจอเพื่อสร้างหน้าต่างเรียกว่าหน้าจอสับสน ไม่มีคำสั่งหน้าจอ exec ไม่มีการผูกมัดอย่างใดอย่างหนึ่งเว้นแต่ว่าคุณจะสร้างคำสั่งของคุณโดยใช้เชลล์สคริปต์ (เช่นนี้screen -S script -X screen sh -c 'command1; command2;':)

การเรียกscreen -S test -X screenด้วยคำสั่ง no นั้นไม่มีประโยชน์เนื่องจากคำสั่งเริ่มต้นคือเชลล์และเมื่อคุณวางไข่เชลล์แล้วคุณจะไม่มีวิธีที่ไม่โต้ตอบ (และไม่เบี่ยงเบน) ในการรันคำสั่งภายในเชลล์นั้น มันเป็นการดีกว่าที่จะรันคำสั่งด้วยตัวเองโดยไม่มีเชลล์แบบโต้ตอบ ผลข้างเคียงคือเมื่อคำสั่งออกไปหน้าต่างหน้าจอจะไม่มีลูกอีกแล้วจะปิด

ตอนนี้คุณสามารถขอให้หน้าจอค้างไว้เปิดหน้าต่างต่อไปหลังจากคำสั่งออกจาก ใช้zombieคำสั่งหน้าจอเพื่อเปิดใช้งาน ลำดับของคุณดูเหมือนว่า:

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

หากต้องการติดตั้งใหม่แบบโต้ตอบ:

screen -S script -r

และในที่สุดคุณสามารถเขียนคำสั่ง -X เหล่านี้เป็นสคริปต์ screenrc แทน

Screenrc:

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

สคริปต์:

screen -d -m -S script -c screenrc

ใช่ฉันรู้ว่า -X กำลังรับคำสั่งหน้าจอสิ่งที่ฉันหมายถึงเมื่อฉันพูดว่า "คำสั่งหน้าจอ Chaining (หนึ่งหลังจาก -X)" (ตกลงมันไม่ชัดเจนเลย) แต่มีคำสั่ง exec หน้าจอดูคน หน้า แต่ที่คุณบอกว่าไม่มีวิธีที่จะทำให้มันทำงานได้อย่างที่ต้องการในโหมดไม่โต้ตอบ อย่างไรก็ตามด้วยโซลูชัน AlexD และคำสั่ง zombie ของคุณเพิ่มฉันได้สิ่งที่ฉันต้องการ! ขอบคุณ
รัศมี

@Tobu: 200 สำหรับการพูดถึงซอมบี้! ในที่สุดฉันก็ไม่เคยสังเกตเห็นมันในคู่มือที่น่ากลัว!
เถาวัลย์

6

หากคุณต้องการเอฟเฟกต์แบบเดียวกันCtrl-A cคุณควรใช้screenแทนexec:

screen -S test -X หางของหน้าจอ -f / var / log / ข้อความ
หน้าจอ -S ทดสอบ -X หน้าจอ
screen -S test -X หางของหน้าจอ -f /var/log/xinetd.log

นอกจากนี้คุณสามารถย้ายคำสั่งของคุณไปยัง$HOME/.screenrc-younameitไฟล์ (โดยไม่มีscreen -S test -Xคำนำหน้า) และเรียกใช้screen -c $HOME/.screenrc-younameitเมื่อคุณต้องการสร้างหน้าจอเฉพาะ


Ctrl-A c อยู่ในบรรทัดที่ 3 ของฉันฉันเดาว่า exec ไม่ทำงานเพราะ exec รันคำสั่งในหน้าต่างปัจจุบันซึ่งอาจไม่ได้กำหนดเมื่อถอดหน้าจอออก หน้าจอการหลีกเลี่ยงปัญหาของคุณและคำสั่งนั้นดีฉันควรลองใช้ดู! ฉันจะเพิ่มคำตอบให้กับตัวเองเพราะคำตอบของคุณขาดการสร้างเซสชันและมีบรรทัดที่ไร้ประโยชน์ (อันที่สองกระโดดข้าม 1 หน้าต่าง)
รัศมี

ในความเป็นจริงมันไม่ทำงานตามที่คาดไว้หน้าต่างปิดทันทีที่โปรแกรมหยุดทำงาน หากคุณทำหน้าจอ -S ทดสอบ -X หน้าจอ ls หน้าต่างจะปิดและคุณจะไม่เห็นผลลัพธ์เลย
รัศมี

1

ใช้byobuเป็นตัวเลือก?


ฉันลองแล้วฉันไม่เห็นว่ามันจะช่วยได้อย่างไร แต่ถ้าคุณมีวิธีแก้ปัญหาการทำงานกับ byobu มันก็โอเคฉันชอบหน้าจอเฉพาะโซลูชัน แต่ใช้การเพิ่มบนดีกว่าไม่มีวิธีแก้ปัญหา!
รัศมี

1

ฉันทำในสิ่งเดียวกันคืนนี้ฉันต้องการเปิดหน้าจอพร้อมไฟล์หลายไฟล์ที่เปิดไว้ล่วงหน้า ฉันใช้เวลาสักครู่เพื่อคิดทั้งหมดนี้ แต่ในที่สุดฉันก็พบสิ่งต่อไปนี้ซึ่งดูเหมือนว่าจะทำงานได้ดี:


#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 

สิ่งนี้จะสร้างหกหน้าจอที่แตกต่างกันโดยที่หน้าจอ 1-5 จะเปิดไฟล์ต่างๆ ฉันไม่ทราบรายละเอียดทั้งหมด แต่ 'สิ่งของ' บอกหน้าจอโดยพื้นฐานแล้วข้อความที่ยกมาต่อไปนี้ไม่ใช่คำสั่งหน้าจอ 'eval' จะวิวัฒนาการทุกอย่างที่มีอยู่ในเครื่องหมายคำพูด หากไม่มีสิ่งนี้ screen -p 4 -S CS140 -X stuff "vim cs140-ps2/src/threads/intr-stubs.h\015" ก็จะทำให้ข้อความที่ยกมาโดยไม่ต้องดำเนินการ Eval จะอ่าน '\ 015' เป็นบรรทัดใหม่และดำเนินการกับข้อความก่อนหน้า

ในแง่ของรายละเอียดอื่น ๆscreen -p 1 -S CS140 -X CMD บอกให้เชลล์ส่ง 'CMD' ไปที่หน้าต่างแรกของเซสชันหน้าจอชื่อ 'CS140'

หวังว่าจะช่วย!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.