วิธีรันคำสั่งในหน้าจอและแยกออก?


75

ฉันจะได้รับหน้าจอเพื่อดำเนินการคำสั่งแล้วแยกออก (นั่นคือโดยอัตโนมัติในสคริปต์เดียวโดยไม่ต้องใส่เพิ่มเติมนอกเหนือจากการเริ่มต้นสคริปต์)? เช่นฉันใช้ myscript.sh และเริ่มเซสชันหน้าจอโดยอัตโนมัติดำเนินการคำสั่งแล้วแยกออก

คำตอบ:


114

นี่เป็นวิธีง่ายๆ:

screen -d -m yourcommand

4
ไม่มีลูกเต๋า หน้าจอคำสั่ง -d -m หน้าจอรายการบอกว่าไม่มีซ็อกเก็ตหน้าจอ -r ไม่มีเซสชัน
darkfeline

1
ไม่พบคำสั่งของคุณหรือทำงานไม่ถูกต้องในสภาพแวดล้อมหน้าจอที่สร้างขึ้นโดยอัตโนมัติ ลองเพียงแค่การทำscreen yourcommandโดยไม่ได้-dและ-mและดูวิธีการที่จะไปครั้งแรก
Alan Curry

คุณพูดถูก หน้าจอจะสิ้นสุดลงเมื่อคำสั่งเสร็จสิ้นตรงกันข้ามกับความคาดหวังของฉัน แต่คำตอบของคุณใช้ได้ผล
darkfeline

3
คุณสามารถเปลี่ยนได้โดยเปิดใช้งานzombieตัวเลือกในหน้าจอ ใส่ในของคุณzombie xy ~/.screenrcมันควรจะเป็นไปได้ที่จะเปิดใช้งานสำหรับเซสชั่นหนึ่งเพียงแค่ใส่zombie xyในไฟล์อื่นและใช้-c fileแต่ด้วยเหตุผลบางอย่างที่ไม่ทำงานเมื่อฉันลองมัน หรือเพียงแค่ใช้sh -c 'yourcommand;while :;do sleep 9999; done'
Alan Curry

@ AlanCurry, Nope นี่ไม่ได้ผลสำหรับฉันเช่นกันแม้ว่าคำสั่งจะทำงานได้อย่างสมบูรณ์แบบ (และใช้เวลาหลายชั่วโมง) เมื่อทำงานในหน้าจอด้วยตนเอง
Cerin

47

หากต้องการเรียกใช้คำสั่งเดียวในหน้าจอและถอดคุณอาจลอง:

screen -dm sleep 10

หากต้องการเรียกใช้หลายคำสั่งให้ลอง:

screen -dm bash -c "sleep 10; myscript.sh"

โปรดทราบว่าเมื่อโปรแกรมหยุดทำงานหน้าจอ (ต่อค่าเริ่มต้น) จะฆ่าหน้าต่างที่มีอยู่

หากคุณไม่ต้องการให้เซสชันถูกฆ่าหลังจากสคริปต์เสร็จสิ้นให้เพิ่มexec shที่ส่วนท้ายเช่น:

screen -dm bash -c 'sleep 5; exec sh'

หากต้องการแสดงรายการเซสชันทั้งหมดของคุณลอง:

screen -list

ที่เกี่ยวข้อง: หน้าจอเริ่มต้น Unix, เรียกใช้คำสั่งถอด


2
สิ่งนี้ใช้ได้กับฉันใน Ubuntu 16.04 นอกเหนือจากชื่อเซสชั่นของคุณเพื่อให้คุณสามารถกลับไปได้ในภายหลังเพิ่ม:-S sessionname screen -dmS MyLongRunningScript bash -c "..."
Dan Dascalescu

16

เพื่อเริ่มเซสชันใหม่ในพื้นหลังด้วยชื่อ 'ง่วง'

screen -S sleepy -dm sleep 60

เพื่อที่จะฆ่าเซสชั่น 'ง่วงนอน'

screen -S sleepy -X quit      

ทำไมมันไม่ทำงานเหมือนscreen -S sleepy -dm "cd myfolder;sleep 60"?
ชุดเครื่องมือ

@Toolkit ปัญหาคือคุณมีคำสั่งในเครื่องหมายคำพูดดังนั้นจึงถือว่าเป็นคำสั่งขนาดใหญ่หนึ่งคำสั่ง เห็นได้ชัดว่าเราไม่สามารถถอดมันออกมาได้เนื่องจากเครื่องหมายอัฒภาค เพื่อแก้ปัญหานี้ให้รันคำสั่งดังนี้: screen -S sleepy -dm bash -c "cd myfolder; sleep 60"
Jason Thompson


0

มันเกิดขึ้นกับฉันเมื่อฉันกดปุ่มควบคุม c (sig int) เพื่อออกจากโปรแกรมของฉัน มันออกจากทางทั้งหมดจากการทุบตีทั้งหมด ดังนั้นฉันจึงพบสิ่งนี้เพื่อจับ SIGINT และป้องกันการออกจากการทุบตีครั้งล่าสุด (ต้องพิมพ์ exit เพื่อออก)

screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"


example:

screen -dmS "status_updates" bash -c "trap 'echo gotsigint' INT; cd /opt/status_update ; forever index.js ;  bash"

ฉันพบว่ามีประโยชน์ในการใช้ cron เพื่อเรียกใช้โปรแกรม nodejs เมื่อเริ่มต้น และเรียกใช้หน้าจอในเวลาบูต ใน cron มีไวยากรณ์เหตุการณ์พิเศษ @reboot เหตุการณ์

to edit cron, execute:
crontab -e

then type
@reboot screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.