เรียกใช้เซสชันหน้าจอเมื่อบู๊ตจาก rc.local


10

ฉันพยายามเรียกใช้หน้าจอเดี่ยวภายใต้ผู้ใช้เฉพาะใน rc.local เมื่อบูต รหัสด้านล่างคือสิ่งที่ฉันมีจนถึงตอนนี้ แต่มันไม่ทำงานสำหรับฉัน ดูเหมือนว่าส่วน su จะให้ฉันข้อผิดพลาด

su - username -c /usr/bin/screen -dmS test bash -c '/var/www/path/to/script/script.sh; exec bash'

คำตอบ:


13

ฉันคิดว่า-cพารามิเตอร์ทั้งสอง( suและbash) จะต้องมีการเสนอราคาอย่างน้อยที่สุด

su - username -c "/usr/bin/screen -dmS test bash -c '/var/www/path/to/script/script.sh; exec bash'"

นอกจากนี้-คาดว่าจะเป็นครั้งสุดท้ายและอาจไม่เป็นที่ต้องการที่นี่ (ดูman su)


พูดอีกไม่กี่ sudo อาจเป็นทางเลือกที่ดีกว่าสำหรับคำสั่ง one-shot เช่นคุณ แต่ไม่จำเป็นต้อง:

sudo -iu username /usr/bin/screen -dmS test bash -c '/var/www/path/to/script/script.sh; exec bash'

โดยเฉพาะอย่างยิ่งคุณสามารถใช้หนึ่งระดับน้อย quoting sudoกับ

สิ่งที่คุณต้องระวังก็คือการรันคำสั่งโดยไม่มีพา ธ สัมบูรณ์ในบริบทที่ได้รับการยกเว้น สิ่งนี้มีไว้สำหรับsu(หรือsudo) แต่ยังรวมถึงเส้นทางไปยังbashในคำสั่งของคุณ screenคุณกำลังทำมันถูกต้องกับ

เพิ่งทดสอบต่อไปนี้และมันก็ใช้งานได้ดี ฉันคิดว่า-นี่เป็นปัญหาหลักในบรรทัดต้นฉบับของคุณ:

/bin/su username -c "/usr/bin/screen -dmS test bash -c '/home/username/test.sh; exec bash'"

คำพูดที่ชั่วร้าย:ทำไมเจ้าไม่tmuxลองดูล่ะ? ฉันเพิ่งเปลี่ยนและไม่เคยมองย้อนกลับไป สิ่งเดียวที่ฉันต้องการที่จะเปลี่ยนทันทีเป็นคีย์ผสมคำนำหน้าซึ่งtmuxเริ่มต้นที่Ctrl+ B- กลับไป GNU 'sscreen +CtrlA

มันช่วยให้การแยกหน้าต่างของคุณเป็นจำนวนบานหน้าต่างโดยพลการ (ตามแนวตั้งและแนวนอน) และรูปแบบไฟล์กำหนดค่า แน่นอนtmuxว่าดีscreenเมื่อคุณต้องการเรียกใช้โปรแกรม / สคริปต์ที่ไม่ได้เขียนเป็น daemon ในพื้นหลัง หากคุณตั้งใจที่จะมีปฏิสัมพันธ์กับ Multiplexer ขั้ว tmuxแต่ผมขอแนะนำให้อย่างอบอุ่น


ฉันจะลองดูในไม่กี่นาที สคริปต์ที่ฉันใช้นั้นใช้เส้นทางแบบสัมบูรณ์ดังนั้นคุณจะแนะนำsuหรือsudoไม่
ATLChris

1
sudoไม่ใช่ตัวเลือกที่ดีถ้าเรียกใช้จาก rc.local ซึ่งคุณเป็นรูทอยู่แล้วเนื่องจากคุณจะพลาดเชลล์ล็อกอิน ในบันทึกด้านข้างให้ดู/etc/init/tty1.conf- แทนที่ [a] getty ด้วยหน้าจอที่นี่
aquaherd

@aquaherd: มันเป็นสิ่งที่ฉันมีในใจเมื่อผมเขียนแต่ไม่จำเป็นต้อง เบาะแสจริงๆแล้วเป็นปกติsudo su -... sudo(superuser do), su(ผู้ใช้สวิตช์) ... ความคิดที่ดีเกี่ยวกับ. conf
0xC0000022L

1
ฉันต้องบอกว่าฉันกำลัง +1 โพสต์นี้เพียงเพราะความชั่วร้ายของคุณ ฉันรักมัน! มันเป็นการทดแทนที่ยอดเยี่ยมสำหรับหน้าจอเนื่องจากมีใครสามารถบังคับให้เริ่มเซสชันใหม่
นักฟิสิกส์ควอนตัม

@aquaherd สามารถเริ่มต้นเปลือกเข้าสู่ระบบโดยใช้เพียงแค่ปรับsudo -i
muru


1

นี่คือสิ่งที่ฉันใช้ฉันพบว่ามันสะอาดและเรียบง่ายที่สุด (ทดสอบการทำงานด้วยตัวเอง):

แทนที่ "ผู้ใช้" ด้วยผู้ใช้เพื่อเรียกใช้เป็น แทนที่ "nameyouchoose" เป็นชื่อของหน้าจอเซสชันแทนที่ "/script/start.bash" ไปยังเส้นทางของสคริปต์ของคุณ

/usr/bin/sudo -u user /usr/bin/screen -dmS nameyouchoose /script/start.bash

ที่มา: http://realtechtalk.com/How_to_start_screen_in_bash_script_or_from_etcrclocal_on_startup_as_a_specific_user-1980-articles


0

การเริ่มต้นสคริปต์ในหน้าจอเดี่ยวที่แยกออกใหม่ในฐานะผู้ใช้ปัจจุบัน (rc.local = root):

screen -dmS <session name> <command>ตัวอย่าง:

screen -dmS screenName bash /home/user/run.sh


การเริ่มต้นสคริปต์จาก rc.local เป็นuser:

runuser -l user -c 'screen -dmS screenName bash /home/user/run.sh'

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