วิธีตั้งค่าตัวแปรสภาวะแวดล้อมโกลบอลเมื่อบูตผ่านสคริปต์และให้พร้อมใช้งานสำหรับแอ็พพลิเคชันที่รันก่อนล็อกอิน?


17

ฉันมีบริการที่ทำงานตอนบู๊ตและในบริการนั้นจะเรียกสคริปต์ทุบตีในพื้นหลังที่ส่งออกตัวแปรสภาพแวดล้อมบางอย่าง ปัญหาที่ฉันมีคือตัวแปรสภาพแวดล้อมเหล่านั้นไม่ได้ถูกส่งไปยังพาเรนต์ของกระบวนการพื้นหลังดังนั้นทันทีที่สคริปต์ของฉันทำงานเสร็จพวกเขาก็หายไป

นอกจากนี้หลังจากที่เรียกใช้สคริปต์แล้วบริการจะเรียกใช้สคริปต์อื่นที่เริ่มต้นแอปพลิเคชันที่ฉันมี แอปพลิเคชันนี้ต้องการการเข้าถึงตัวแปรสภาพแวดล้อมเหล่านั้น

ระบบ RHEL ที่ฉันใช้งานนั้นมีไว้สำหรับผู้ใช้ที่ไม่เคยลงชื่อเข้าใช้ระบบจะบู๊ตและเริ่มแอปพลิเคชันเท่านั้น ฉันรู้ว่าตัวแปรสภาพแวดล้อมสำหรับกระบวนการผู้ปกครอง / เปลือกไม่สามารถจริงๆตั้งค่าได้โดยเปลือกกระบวนการพื้นหลังเด็กแม้ว่า

ฉันต้องการวิธีการทำสิ่งนี้ผ่านสคริปต์ที่ถูกเรียกใช้โดยบริการของฉัน (ไม่จำเป็นต้องอยู่ในพื้นหลัง) ไม่ใช่โดยการเพิ่มเข้าไปในบริการของฉัน (ซึ่งไม่ได้ผลสำหรับฉัน) และไม่เก็บไว้ใน/etc/environmentหรือ.profileหรืออะไรเช่นนั้น

ในบริการของฉันฉันพยายามเพิ่มตัวแปรสภาพแวดล้อม (ไม่ใช่สิ่งที่ฉันต้องการจะทำ):

    export TEST=192.168.1.1

ฉันลองสิ่งนี้ในบริการของฉันด้วย:

    TEST=192.168.1.1
    export TEST=${TEST}

ฉันพยายามเปลี่ยนวิธีการให้บริการของฉันเรียกสคริปต์ทุบตี:

    /bin/asdf/script &

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

    . ./bin/asdf/script
    #I'm very confused why this didn't work

ฉันพบสิ่งนี้ซึ่งดูน่าสนใจ แต่มันก็ไม่ได้แปลกในกรณีของฉัน

คำตอบ:


12

คุณสามารถลองวางสคริปต์เพื่อรวบรวมตัวแปร /etc/profile.d/

ตัวอย่าง:

/etc/profile.d/somescript.sh

#!/bin/bash
TEST=$(cat /var/somefile)
export $TEST

/etc/profileทำการเรียกที่จะเรียกใช้สคริปต์ใด ๆ/etc/profile.d/และสิ่งนี้จะใช้กับผู้ใช้ทั้งหมดในระบบรวมถึงรูท


คุณอาจจะมีบางอย่างที่นี่ ฉันไม่ต้องการทำอย่างนั้นแม้ว่าจะไม่สามารถพบสคริปต์ในไดเรกทอรี / etc ด้วยเหตุผลของ IA แต่ฉันคิดว่าฉันสามารถสร้าง symlink ในที่นั่นชี้ไปที่สคริปต์ของฉัน แต่ในการทำให้สิ่งต่าง ๆ ซับซ้อนตัวแปรสภาพแวดล้อมบางอย่างที่สคริปต์กำหนดมานั้นมาจากตัวแปรสภาพแวดล้อมที่กำหนดโดยบริการ ดังนั้นสิ่งนี้อาจไม่ทำงานเนื่องจากต้องตั้งค่าตัวแปรไว้แล้วก่อนที่สคริปต์บริการจะถึงจุดสิ้นสุด แต่ยังไม่เร็วเกินไปหรือตัวแปรสภาพแวดล้อมที่ต้องการยังไม่ได้สร้างโดยบริการ
sqenixs

ฉันเดาว่าฉันสามารถกำจัดการพึ่งพาตัวแปรที่ตั้งไว้ในบริการได้ ในกรณีนี้ฉันคิดว่าจะใช้งานได้ตราบใดที่สคริปต์เริ่มทำงานก่อนที่บริการจะเริ่มขึ้น คุณรู้หรือไม่เมื่อเชลล์ล็อกอินเริ่มทำงาน หรือฉันสามารถควบคุมได้เมื่อเชลล์ล็อกอินเริ่มทำงาน? ฉันไม่มีบริการในไดเรกทอรี rcX.d สำหรับระดับการทำงานของฉัน
sqenixs

1

ไม่มีวิธีใดที่กระบวนการจะมีอิทธิพลต่อสภาพแวดล้อมของกระบวนการอื่นที่มีอยู่ กระบวนการมีอิทธิพลต่อสภาพแวดล้อมของกระบวนการลูกของพวกเขาเท่านั้น

ดังนั้นคุณต้องตั้งค่าตัวแปรสภาพแวดล้อมเหล่านี้ในบรรพบุรุษของแอปพลิเคชันที่ต้องการพวกเขา แทนที่จะให้บริการของคุณแยกจากกันให้เรียกใช้สคริปต์ทุบตีการตั้งค่าสภาพแวดล้อมและแอปพลิเคชันให้บริการของคุณเรียกใช้งานสคริปต์ทุบตีที่ตั้งค่าตัวแปรสภาพแวดล้อมจากนั้นเปิดใช้แอปพลิเคชัน

#!/bin/bash
. /path/to/environment/variable/setter.bash
exec /path/to/application

จากสิ่งที่ฉันได้อ่านทางออนไลน์มีแฮ็ก (มีบางสิ่งที่เกี่ยวข้องกับ eval ในสคริปต์ต้นฉบับหรือการใช้ gdb) เพื่อให้มันทำงานได้ ฉันไม่ได้สนใจมากจนเกินไปที่จะอยู่ในพื้นหลังหากฉันสามารถเรียกใช้คำสั่งใน "shell" ปัจจุบัน (คุณอยู่ในเชลล์ในระหว่างการบูทเมื่อบริการของคุณกำลังทำงานอยู่หรือไม่) แล้วมันก็ใช้ได้เหมือนกัน
sqenixs

น่าเสียดายที่ฉันไม่สามารถเริ่มแอปพลิเคชันจากบริการได้เนื่องจากมีหลายกระบวนการที่เริ่มต้นและสิ่งต่าง ๆ ที่กำหนดค่าจากสคริปต์เริ่มต้นแอปพลิเคชันและพวกเขาจะต้องแยกจากบริการสำหรับ IA
sqenixs

@sqenixs เชลล์เป็นกระบวนการที่คล้ายกัน ไม่มีสิ่งเช่น "อยู่ในเปลือก" เมื่อคุณพูดถึง“ eval on source script” นั่นเป็นโปรโตคอลที่โปรแกรม (ซึ่งอาจไม่ใช่เชลล์สคริปต์) พิมพ์คำจำกัดความในไวยากรณ์เชลล์และเชลล์สคริปต์ตีความพวกเขา การตั้งค่าตัวแปรสภาพแวดล้อมด้วย gdb สามารถใช้งานได้หรือไม่มีผลหรืออาจทำให้แอปพลิเคชันของคุณเสียหาย อย่างที่คุณอาจจินตนาการไม่แนะนำให้ใช้ดีบักเกอร์ในการผลิต (และอีกครั้งด้วยเหตุผลที่ดี)
Gilles 'หยุดความชั่วร้าย'

อาจมีวิธีการแก้ไขปัญหาของคุณ แต่คุณจะต้องแม่นยำมากขึ้นกับความต้องการของคุณ ในคำถามของคุณคุณเขียน“ หลังจากสคริปต์รันบริการแล้วเรียกสคริปต์อื่นที่เริ่มต้นแอปพลิเคชัน” ดังนั้นคุณดูเหมือนจะมีทางออก: ตั้งค่าตัวแปรสภาพแวดล้อมภายในสคริปต์อื่น ๆ แต่ในความคิดเห็นคุณเขียนว่าคุณ“ ไม่สามารถเริ่มแอปพลิเคชันจากบริการ” แล้วมันคืออะไร?
Gilles 'หยุดความชั่วร้าย'

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