TL; DR:การใช้งานหรือดีกว่าsudo -b
openvpn [...] --daemon
เนื่องจากคุณกำลังใช้งานopenvpn
(และโดยเฉพาะอย่างยิ่งเนื่องจากคุณต้องการรันโปรแกรมในฐานะรูทในพื้นหลัง) ข้อมูลที่จ่ายทั่วไปเกี่ยวกับวิธีการเรียกใช้คำสั่งในพื้นหลังไม่ได้ระบุถึงสถานการณ์ของคุณ คุณพูดว่า:
ฉันพยายามต่อท้าย & ไปยังคำสั่ง cpenvpn และวาง nohop ไว้ข้างหน้า ทั้งสองไม่ทำงาน
คำสั่งของคุณคือ:
sudo openvpn ~/my_connection.ovpn
ภายใต้sudo
การกำหนดค่าเริ่มต้นของหากคุณไม่ได้ป้อนรหัสผ่านของคุณเมื่อเร็ว ๆ นี้sudo
ในบริบทเดียวกัน (สำหรับการใช้งานแบบโต้ตอบซึ่งโดยปกติจะหมายถึงเทอร์มินัลเดียวกัน) จากนั้นจะขอรหัสผ่านของคุณ แต่ถ้าคุณเรียกใช้คำสั่งในพื้นหลังโดยต่อท้าย&
คุณจะไม่แสดงบรรทัดหรือให้โอกาสในการพิมพ์[sudo] password for user:
ดังนั้นในสถานการณ์เช่นนี้เรียกใช้คำสั่งที่ป้อนรหัสผ่านของคุณและส่งไปยังพื้นหลังหลังจากนั้นเป็นวิธีที่เหมาะสมที่จะทำมันสำหรับการใช้งานแบบโต้ตอบ
แต่มันไม่ได้เป็นวิธีเดียวและที่คุณบอกว่าคุณจะไม่ต้องการที่จะทำในสคริปต์
วิธีที่ 1:ตรวจสอบว่าsudo
มีการประทับเวลาใหม่
คุณสามารถมั่นใจsudo
ได้ว่ามีการประทับเวลาปัจจุบันเมื่อใช้เพื่อเรียกใช้คำสั่งของคุณโดยการเรียกใช้ครั้งแรก:
sudo -v
จากนั้นหลังจากนั้นคุณสามารถเรียกใช้:
sudo openvpn ~/my_connection.ovpn &
แต่ก็มักจะดีกว่าที่จะหลีกเลี่ยง&
(และnohup
) sudo
โดยสิ้นเชิงเมื่อคุณต้องการเรียกใช้คำสั่งในพื้นหลังที่มี โดยเฉพาะอย่างยิ่งกรณีการเขียนสคริปต์
วิธีที่ 2:sudo -b
การใช้งาน โดยทั่วไปนี่คือสิ่งที่คุณต้องการ
แต่คุณสามารถรันsudo
ตัวเองในเบื้องหน้า แต่ผ่านการ-b
ตั้งค่าสถานะเพื่อให้sudo
คำสั่งที่จะทำงานในพื้นหลัง
sudo -b openvpn ~/my_connection.ovpn
นี่เป็นวิธีที่ดีกว่าโดยเฉพาะถ้าคุณใส่คำสั่งในสคริปต์ ด้วยsudo -b
คุณไม่ได้รับการควบคุมงานแต่ในสคริปต์เปลือกควบคุมงานถูกปิดใช้งานโดยค่าเริ่มต้นและคุณไม่ควรมักจะใช้มัน
ตามที่man sudo
อธิบายไว้:
-b, --background
Run the given command in the background. Note that it is not
possible to use shell job control to manipulate background
processes started by sudo. Most interactive commands will
fail to work properly in background mode.
สิ่งนี้ใช้งานได้เนื่องจากไม่มีสิ่งใดทำงานในพื้นหลังจนกว่าหลังจากที่ sudo ได้รับรหัสผ่านของคุณ (หากจำเป็น) และพิจารณาว่าคุณได้รับอนุญาตให้เรียกใช้คำสั่ง
วิธีที่ 3:แต่สำหรับคุณอาจจะเพียงแค่ใช้มันด้วยopenvpn
--daemon
openvpn
จะทำงานในพื้นหลังโดยอัตโนมัติหากคุณเรียกใช้ด้วย--daemon
ตัวเลือก:
sudo openvpn ~/my_connection.ovpn --daemon
ผ่านชื่อไฟล์--daemon
ของคุณ.opvn
มากกว่าเดิม อาร์กิวเมนต์ต่อไปนี้--daemon
ถ้ามีถูกตีความว่าเป็นชื่อที่openvpn
กระบวนการdaemonized ควรใช้ (ทำไม่ได้นอกจากนี้ยังผนวก&
.)
ไม่ว่าจะเหมาะสมหรือไม่นั้นขึ้นอยู่กับว่าการโต้ตอบใด ๆ จะต้องเกิดขึ้นหลังจากที่openvpn
ถูกเรียกใช้หรือไม่ และที่~/my_connection.ovpn
ขึ้นอยู่ในส่วนที่เกี่ยวกับสิ่งที่ตั้งขึ้นใน แต่ถ้าopenvpn
ไม่สามารถ daemonize ได้ทันทีวิธีอื่นทั้งหมดของการเรียกใช้ทันทีในพื้นหลังก็จะแตกเช่นกัน
ดังนั้นในสถานการณ์ใด ๆ ที่คุณรู้ว่าคุณต้องการopenvpn
ที่จะเริ่มต้นการทำงานในพื้นหลังและคุณรู้ว่าคุณจะไม่ต้องการที่จะนำมันกลับเข้ามาในเบื้องหน้าคุณควรขอพิจารณาวิธีการเรียกใช้กับที่--daemon
ตัวเลือก นี่เป็นopenvpn
โปรแกรมเฉพาะสำหรับโปรแกรมส่วนใหญ่ไม่สนับสนุน--daemon
ตัวเลือกแม้ว่าโปรแกรมเซิร์ฟเวอร์จำนวนมากจะมีตัวเลือกบางอย่าง (ชื่อและไวยากรณ์แตกต่างกันไปอย่างไรก็ตาม)
การตัดสินใจหรือไม่ที่จะใช้ตัวเลือกนี้ (และวิธีการที่คุณต้องการที่จะใช้) ผมแนะนำให้คุณอ่านหน้าคู่มือโดยเฉพาะอย่างยิ่งในส่วนที่เกี่ยวกับ มันมีข้อมูลที่มีประโยชน์มากมายและฉันแค่อ้างอิงย่อหน้าแรกที่นี่:openvpn
--daemon
--daemon [progname]
Become a daemon after all initialization functions are
completed. This option will cause all message and error output
to be sent to the syslog file (such as /var/log/messages),
except for the output of scripts and ifconfig commands, which
will go to /dev/null unless otherwise redirected. The syslog
redirection occurs immediately at the point that --daemon is
parsed on the command line even though the daemonization point
occurs later. If one of the --log options is present, it will
supercede syslog redirection.
The optional progname parameter [...]
วิธีที่ 4 : บางครั้งก็สมเหตุสมผลที่จะเรียกใช้สคริปต์ทั้งหมดในฐานะรูท
หากคุณมีสคริปต์ที่ดำเนินการหลายอย่างในฐานะรูทสคริปต์จะไม่มีกิจกรรมที่สำคัญใด ๆ ที่จะถูกเรียกใช้โดยไม่เป็นรูทและไม่มีประโยชน์ใด ๆ ที่จะมาจากการรันสคริปต์ในฐานะผู้ใช้ที่ไม่ใช่รูท ผู้ใช้สคริปต์อาจจะรันเป็นรูท
หากเป็นกรณีนี้คุณควรลบออกsudo
จากคำสั่งในสคริปต์ sudo
สคริปต์เป็นรากไม่มีความจำเป็นในการ (แม้ว่ารากใช้สามารถตามค่าเริ่มต้นเรียกใช้คำสั่งใด ๆ ที่เป็นผู้ใช้ใด ๆ รวมทั้งตัวเองด้วยsudo
และไม่ต้องใช้รหัสผ่านจะทำเช่นนั้น. ดังนั้นถ้าคุณทำกรณีลาsudo
ในสคริปต์แล้วมันอาจจะยังคงทำงาน.)
หากคุณมีอินสแตนซ์ใด ๆsudo
ในสคริปต์ที่ใช้เพื่อเรียกใช้คำสั่งในฐานะผู้ใช้รายอื่นที่ไม่ใช่รูท (ด้วย) คุณควรเก็บอินสแตนซ์เหล่านั้นไว้-u user
หากสคริปต์ทั้งหมดกำลังถูกเรียกใช้ในฐานะรูทดังนั้นวิธีการทั่วไปในการสร้างคำสั่งในพื้นหลังนั้นรวมถึงการต่อท้าย&
และหากจำเป็นต้องใช้การใช้nohup
(ซึ่งคุณทราบแล้ว) อย่างไรก็ตามสำหรับสิ่งนี้คุณควรพิจารณาใช้openvpn
กับ--daemon
ตัวเลือก