สร้างหน้าจอและเรียกใช้คำสั่งโดยไม่ต้องแนบ


28

ฉันกำลังทำงานเกี่ยวกับการซ่อมบำรุงอัตโนมัติที่เกี่ยวข้องกับการเริ่มต้นและการหยุดสคริปต์ที่เรียกใช้ในเซสชันหน้าจอ วิธีการของฉันคือฆ่าเซสชันหน้าจอจากนั้นรีสตาร์ทและเรียกใช้คำสั่งจากภายในสคริปต์โดยใช้ความสามารถในการสร้างหน้าจอและส่งคำสั่งโดยไม่ต้องแนบหน้าจอ

อย่างไรก็ตามฉันมีปัญหากับสิ่งนี้ screen -d -m -S screen_nameฉันสามารถสร้างหน้าจอได้อย่างถูกต้องโดยไม่ได้แนบใช้ อย่างไรก็ตามถ้าฉันใช้คำสั่งตาม:

screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''

ด้วย echo -ne '\ 015' ที่ห่อด้วย backticks มากกว่าราคาเดียว มันคือการจำลองผู้ใช้กดปุ่ม Enter เป็นคำสั่งที่ฉันใช้จะย้ายไปยังไดเรกทอรีและรันสคริปต์อยู่ที่นั่น คำสั่งนี้ใช้งานได้ แต่ต่อเมื่อมีการแนบหน้าจอกับเมื่อมันถูกสร้างขึ้น ขณะที่ฉันพยายามทำให้กระบวนการสร้างหน้าจอโดยอัตโนมัติและเรียกใช้คำสั่งภายในนั้นฉันต้องการหลีกเลี่ยงการแนบและแยกออกจากสคริปต์ ฉันจะพยายามแนะนำการสร้างเชลล์สคริปต์ที่มีคำสั่งที่ฉันต้องดำเนินการภายในหน้าจอและแก้ไขตามผลลัพธ์ของฉัน

มีวิธีการสร้างหน้าจอและเรียกใช้คำสั่งภายในหน้าจอในคำสั่งเดียวหรือไม่ต้องแนบกับหน้าจอหลังจากสร้าง แต่ก่อนดำเนินการคำสั่งหรือไม่

ขอบคุณล่วงหน้า.

** อัปเดต - หลังจากลองใช้คำแนะนำเพื่อวางคำสั่งที่ฉันต้องการเรียกใช้ภายในเชลล์สคริปต์ฉันสามารถสร้างหน้าจอและรันคำสั่งจากภายในหน้าจอได้สำเร็จ แต่ฉันได้รับพฤติกรรมที่เมื่อสคริปต์หยุดทำงาน หน้าจอปิดเช่นกัน นี่ไม่ควรเป็นปัญหาเพราะสคริปต์เป็นสคริปต์การบันทึกที่ควรหยุดด้วยความรู้ของผู้ดูแลระบบ sys หรือผ่านสคริปต์ที่ฉันพยายามพัฒนา แต่มันจะดีกว่าถ้ามีการตั้งค่าหน้าจอในลักษณะที่หน้าจอ ไม่หายไปหากสคริปต์หยุดทำงาน เป็นไปได้ไหมที่จะทำสิ่งนี้ให้สำเร็จ **


1
ฉันพบปัญหาเดียวกันนี้และพบวิธีแก้ปัญหาบน superuser.com สำหรับใครก็ตามที่สะดุดกับปัญหานี้superuser.com/questions/342463//
Dan Herbert

เพื่อเปิดหน้าจอคุณสามารถใช้สิ่งที่ต้องการ: screen bash -c 'echo "test"; / bin / bash '
gwyn

1
สำหรับปัญหาการปิดอัตโนมัติของคุณคุณสามารถใช้พิเศษ.screenrcที่มีบรรทัดzombie krซึ่งจะเปิดหน้าต่างเสร็จแล้วและคุณสามารถกดkเพื่อปิด winodw หรือrเรียกใช้คำสั่งในหน้าต่างอีกครั้ง ฉันมีสิ่งนี้เป็นค่าเริ่มต้น. screenrc ของฉัน
Martin C.

คำตอบ:


17

ฉันคิดว่าคุณอาจพบปัญหาหลายอย่าง

หากคำสั่งเสร็จสิ้นก่อนที่คุณจะแนบอีกครั้งหน้าจอจะหายไป คุณสามารถสาธิตสิ่งนี้ได้โดยใช้:

screen -d -m ls -l

มันจะเรียกใช้ls -lคำสั่ง แต่screen -listจะไม่แสดงมันเมื่อกระบวนการบนหน้าจอสิ้นสุดลง

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

screen -d -m bash -c "command1 ; command2 ; command3"

หากสิ่งเหล่านี้มีการใช้งานจำนวนมากบางทีคุณควรสร้างเชลล์สคริปต์ที่รันเฉพาะคำสั่งเหล่านี้จากนั้นใช้คำสั่งที่เรียบง่ายกว่านี้:

screen -d -m /path/to/script.sh

มีวิธีการที่จะได้รับพฤติกรรมที่คล้ายกันโดยไม่ต้องถอดหน้าจอทันทีหรือไม่? ว่าฉันต้องการเริ่มเซสชัน ssh แล้วแยกออกหลังจาก; screen -d -m sshจะแยกที่พรอมต์รหัสผ่านก่อนที่จะทำเซสชั่น
ดาวสว่างสดใส

มันไม่ได้ผลสำหรับฉัน การเปลี่ยนจังหวัดอุบลราชธานี "CommandN" screen -listกับหลายโปรแกรมยาวทำงานส่งผลให้ไม่มีอะไรแสดงใน นอกจากนี้สิ่งนี้ไม่ได้ตั้งชื่อหน้าจอขณะที่ OP พยายามทำ
Cerin

ฉันต้องการรันโปรแกรม python โดยใช้วิธีนี้ ฉันพยายามสร้างสคริปต์ sh เพื่อเรียกใช้ แต่ไม่เห็นหน้าจอในรายการ แต่ฉันใช้ screen -d -m python EventGenerator.pyซึ่งใช้งานได้ดี
Dan Ciborowski - MSFT

1
นั่นน่าจะเป็นbash -c "commands"แทนbash "commands"
marcovtwout

คุณพูดถูกต้องต้องมี -c
Xdg

8

เริ่มหน้าจอเดี่ยว

screen -dmS <screen name>

ดำเนินการคำสั่งในหน้าจอเดี่ยวที่ถูกสร้างขึ้นก่อนหน้านี้

screen -S <screen name> -X stuff '<CMD>\n'

ใช่คุณต้องพิมพ์สัญลักษณ์ป้อนเพื่อส่งคำสั่งมิฉะนั้นจะเพิ่มสตริงลงในหน้าจอ

http://osdir.com/ml/gnu.screen/2003-09/msg00029.html


1
'สิ่งของ' คืออะไร
Nadav B

stuffจริง ๆ แล้วเป็นคำสั่งที่คัดลอกวางคำสั่งอื่นในเซสชันหน้าจอ: stuff [string] คัดสตริงสตริงในบัฟเฟอร์อินพุตของหน้าต่างปัจจุบัน นี่เป็นเหมือนคำสั่ง "วาง" แต่มีค่าใช้จ่ายน้อยกว่ามาก หากไม่มีพารามิเตอร์หน้าจอจะแจ้งให้สตริงไปยังเนื้อหา คุณไม่สามารถวางบัฟเฟอร์ขนาดใหญ่ด้วยคำสั่ง "stuff" มันมีประโยชน์มากที่สุดสำหรับการผูกกุญแจ ดูเพิ่มเติม "bindkey" [อ้างจากtheterminallife.com/sending-commands-into-a-screen-session/]
alisa

2

ฉันเคยพบปัญหานี้มาก่อนมันเป็นข้อผิดพลาดกับการใช้งาน cygwin

สิ่งที่ฉันทำคือสร้าง ".screenrc_detaching" โดยมีเพียงคำสั่งต่อไปนี้

#detach
detach 

จากนั้นเริ่มหน้าจอด้วย

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

จากนั้นคุณมีเซสชั่นหน้าจอของคุณและมันถูกแนบและแยกออกและคุณดีที่จะปั๊มคำสั่ง

ง่ายมาก! : P


2

นี่เป็นงานสำหรับฉันโดยที่-cไม่ได้ทำงาน

screen -d -m bash -c "command1; command2; command3"


1

วิธีคัดลอก 'เพื่อทดสอบคำตอบก่อนหน้าคือ:

 # No sessions:
screen -ls

 # Returns immediately:
time screen -dmS screen_descritive_session_name  bash -c 'sleep 20; hostname >> /tmp/h'

 # New session present:
screen -ls

 # File with return of command was created :)
sleep 20; cat /tmp/h

ผลลัพธ์ที่คาดหวังควรคล้ายกับ:

No Sockets found in /var/run/screen/S-yourusernamehere.

(นั่นหมายความว่าไม่มีการสร้างหน้าจอเซสชันก่อนหน้านี้)

real    0m0.002s
user    0m0.000s
sys     0m0.000s

(เป็นเวลาที่ใช้ในการสร้างหน้าจอและแยกออกจากมันเกือบจะทันที)

There is a screen on:
    20318.screen_descritive_session_name    (20/08/2018 16:29:35)   (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.

(เอาต์พุตนี้แสดงเซสชันหน้าจอที่พร้อมใช้งานสร้างตามคำสั่งล่าสุด)

sleep 20; cat /tmp/h

(นี่catแสดงชื่อโฮสต์ที่ดำเนินการภายในหน้าจอ gnu)


และผลของการทดสอบดังกล่าวคืออะไร?
Pierre.Vriens

คุณพูดถูกไม่มีตัวอย่าง ฉันจะเพิ่ม.
Enrique S. Filiage

ดีกว่ามาก! Merci! +1
Pierre.Vriens

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