เปลี่ยนเป็นพาเรนต์เชลล์โดยไม่ต้องออกจากระบบ


29

สมมติว่าฉันเริ่มต้นในบัญชีท้องถิ่นของฉัน:

avindra@host:~>

จากนั้นฉันเปลี่ยนเป็นรูท:

host:~ #

จากนั้นฉันสลับไปที่ oracle:

[ oracle@host:~]

มีวิธีให้ฉันย้อนกลับไปที่รูทเชลล์ (พาเรนต์) โดยไม่ต้องออกจาก oracle shell หรือไม่?

มันจะสะดวกในกรณีนี้เพราะบัญชี oracle ไม่มีสิทธิ์ sudo ตัวอย่างเช่นฉันอยู่ใน / some / จริงๆ / deep / nested / directory ใน oracle และฉันมีการตั้งค่าตัวแปรสภาพแวดล้อมพิเศษทุกชนิด แต่ฉันต้องกลับไปที่รูทเพื่อสัมผัสไฟล์ระบบ

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

ที่ถูกกล่าวว่ามีวิธีที่จะทำสิ่งที่ฉันถาม?


หากคุณใช้เดสก์ท็อป gui คุณสามารถเปิดหน้าต่างเทอร์มินัลหรือแท็บอื่นหรือเปลี่ยนเป็นคอนโซลเสมือนอื่นได้ ถ้าไม่ใช้หน้าจอตามที่ระบุไว้ในคำตอบอย่างใดอย่างหนึ่ง
Joe

ฉันจะดูที่หน้าจอฉันไม่เคยใช้มาก่อน สำหรับแท็บฉันต้องการใช้หนึ่งแท็บสำหรับโฮสต์ ฉันพบเวิร์กโฟลว์ที่ใช้แท็บหลายแท็บต่อโฮสต์เพื่อให้ยุ่งยาก ฉันทำงานเป็นจำนวนมากในระบบโฮสต์ / ระบบแบบกระจายดังนั้นแม้จะมีหนึ่งแท็บต่อโหนดในคลัสเตอร์สามารถทำให้เกิดความสับสนได้ ในใจของฉันหนึ่งแท็บ = หนึ่งโฮสต์ที่ไม่ต่อเนื่อง
Avindra Goolcharan

คำตอบ:


41

คุณสามารถจำลอง a CTRL-Z(ซึ่งปกติคุณใช้เพื่อแบ็กกราวน์กระบวนการชั่วคราว) โดยใช้killคำสั่ง:

[tsa20@xxx01:/home/tsa20/software]$ kill -19 $$

[1]+  Stopped                 sudo -iu tsa20
[root@xxx01 ~]# fg
sudo -iu tsa20
[tsa20@xxx01:/home/tsa20/software]$

bashเพียงดักจับCTRL-Zคีย์ผสม kill -19ส่งSIGSTPไปยังกระบวนการที่มีประสิทธิภาพในสิ่งเดียวกัน


1
ในตัวzshคุณสามารถวิ่งsuspendได้
มิเคล

3
@Mikel, zshหรือcsh, tcshหรือbash, หรือ Bourne shell หรือksh... (ในksh, ระงับเป็นนามแฝงสำหรับ'kill -s STOP $$' (จดบันทึกข้อผิดพลาดที่มีคำพูดที่หายไปประมาณ $$))
Stéphane Chazelas

2
bashไม่ได้ดัก CTRL-Z เมื่อคุณกด CTRL-Z, จำลอง terminal ของคุณจะส่ง^Zตัวอักษร (0x1a) ไปทางด้านหลักของอุปกรณ์ Pty วินัยเส้นของผู้ขับขี่ Pty แล้วส่ง SIGTSTP กับกลุ่มกระบวนการเบื้องหน้าของอาคาร จนกว่าจะถึงตอนนั้นbashจะไม่เกี่ยวข้องเลย SIGTSTP นั้นอาจทำให้หัวหน้ากลุ่มกระบวนการหยุดการทำงานชั่วคราวจากนั้นกระบวนการwait()ที่bashทำอยู่จะส่งคืน
Stéphane Chazelas

5
โปรดทราบว่าไม่มีการรับประกันว่า19จะเป็นจำนวนของ SIGTSTP ใช้kill -s TSTPหรือkill -s STOP(TSTP สามารถติดหรือละเว้นได้ STOP ไม่สามารถทำได้)
Stéphane Chazelas

2
@ nyuszika7h $$อาจเป็นแบบอ่านอย่างเดียว แต่IFSไม่ใช่ ลองIFS=0123456789; suspendในkshตัวอย่างเช่น
Stéphane Chazelas

3

Csh, bash, ksh, zsh, มีsuspendคำสั่ง builtin (หรือนามแฝงในหน่วย ksh) ที่ทำเช่นนั้น คำสั่งนี้ส่วนใหญ่เทียบเท่ากับการส่งสัญญาณ TSTP ไปยังเชลล์ bash และ zsh ทำการจัดการสัญญาณเพิ่มเติมและการเล่นปาหี่เล็กน้อยและในเชลล์เหล่านี้suspendคำสั่งทำงานแม้ว่าเชลล์จะไม่สนใจ TSTP ในปัจจุบัน

นอกจากนี้คุณยังสามารถส่งสัญญาณไปยังเชลล์ด้วยตนเองkill -STOP $$ได้


0

ฉันขอแนะนำให้คุณใช้ (ติดตั้งหากจำเป็น) โปรแกรมที่เรียก[screen][1]ว่าให้คุณเปิดหน้าต่างเทอร์มินัลหลายเครื่อง มันถูกออกแบบมาสำหรับ ttys Xเพื่อให้มันทำงานได้ดีโดยไม่จำเป็น คุณสามารถใช้แป้นพิมพ์ลัดเพื่อสลับระหว่างเทอร์มินัลและยกเลิกการเชื่อมต่อและออกจากระบบโดยที่เทอร์มินัลของคุณยังคงทำงานอยู่จากนั้นกลับเข้าสู่ระบบและเชื่อมต่ออีกครั้ง

ฉันเชื่อว่า Linux ดิสทริบิวชันส่วนใหญ่มีแพ็คเกจสำหรับโปรแกรมนี้และฉันได้ใช้แพ็คเกจบน Solaris แล้ว แน่นอนว่ากรณีที่เลวร้ายที่สุดคือคุณสามารถติดตั้งจากแหล่งที่มา


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