จุดประสงค์ของการสั่งทุบตี `` suspend 'builtin คืออะไร?


22

ฉันพิมพ์help suspendและได้รับคำอธิบายสั้น ๆ นี้:

suspend: suspend [-f]
    Suspend shell execution.

    Suspend the execution of this shell until it receives a SIGCONT signal.
    Unless forced, login shells cannot be suspended.

    Options:
      -f    force the suspend, even if the shell is a login shell

    Exit Status:
    Returns success unless job control is not enabled or an error occurs.

ฉันเข้าใจสิ่งนี้ได้อย่างไร: ฉันพิมพ์suspendและเทอร์มินัลค้างไม่มีแม้แต่ strg + c สามารถทำให้น้ำแข็งได้ แต่เมื่อฉันเปิดเทอร์มินัลอื่นและค้นหา PID สำหรับไอเท็มที่ถูกตรึงและพิมพ์kill -SIGCONT PID-NRสัญญาณ SIGCONT จะถูกส่งไปที่เทอร์มินัลที่แช่แข็ง

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


2
หลีกเลี่ยงการเรียกใช้โปรแกรมภายนอก (ฆ่า) สำหรับการระงับ
Ipor Sircer

คำตอบ:


23

หากคุณเริ่มเชลล์จากเชลล์อื่นคุณสามารถระงับเชลล์ภายในได้ พูดเมื่อใช้suและต้องการเปลี่ยนกลับไปใช้ผู้ใช้ปกติสักครู่:

user$ su
Password: ...
root# do something
root# suspend
user$ do something as the ordinary user again
user$ fg
root# ...

(หากคุณทำเช่นนั้นอย่าลืมเชลล์ที่มีสิทธิ์เปิดในพื้นหลัง ... )

ในทำนองเดียวกันหากคุณหนีไปที่เชลล์จากโปรแกรมอื่น ( !คำสั่งในเช่นless) คุณยังคงสามารถระงับเชลล์ได้ แต่ฉันจะไม่คาดหวังว่าโปรแกรมอื่น ๆ อีกมากมายที่จะจัดการกับมันได้อย่างดีเมื่อพวกเขาเปิดตัว subprocess ซึ่งจะหยุดทำงานชั่วคราว


1
ฉันเพิ่งลองใช้งานvimและทำ a :shเพื่อรับ subshell (โดยเฉพาะzshsubshell) การทำงานsuspendทำให้ฉันแตกในเปลือกเดิม (มันหยุดทั้ง subshell และ vim)
เควิน

1
@ เควินzshดูเหมือนว่าฉลาดกว่าbashฉันพยายามหลบหนีจากทั้งคู่lessและviของเดเบียนvim.tiny: zshหยุดแอพแม่ด้วยเช่นกันbashแขวนทุกสิ่งไว้ bashในการbashทำงานแม้ว่า
ilkkachu

1
ฉันไม่ทราบว่าสิ่งที่ฉันพิมพ์ sudo su เป็น subshell เริ่ม เมื่อฉันพิมพ์ suspend ในเชลล์หลัก shell ก็ค้าง แต่วิธีที่คุณแสดงเมื่อฉันวางไว้ข้างใน subshell ฉันจะกลับไปที่เชลล์หลักโดยอัตโนมัติ
sharkant

25

นั่นเท่ากับการกดCtrl+Zคำสั่งอื่น ๆ

มันระงับเปลือกและให้การควบคุมกลับไปที่เปลือกแม่หรือกระบวนการถ้ามี

ตัวอย่าง:

zsh$ bash
bash-4.4$ cd /
bash-4.4$ suspend
zsh: suspended (signal)  bash
zsh$ fg
[1]  + continued  bash
bash-4.4$ pwd
/

คุณลักษณะนี้ได้มาจาก csh เปลือกของ BSD (ที่ควบคุมงานมาจาก) ในช่วงต้นยุค 80

ใน AT&T kshเป็นนามแฝงในตัวสำหรับkill -s STOP $$( ใช่โดยไม่มีเครื่องหมายอัญประกาศ! )

ในกรณีของคุณbashอาจจะเป็นคนที่เริ่มต้นโดยตรงจาก terminal emulator และเทอร์มินัลอีมูเลเตอร์ของคุณไม่ได้คาดหวังว่ากระบวนการจะถูกระงับ

นั่นbashคือผู้นำเซสชัน หากผู้นำเซสชันถูกระงับหากเราใช้มุมมองของเทอร์มินัลเวลาเก่าผู้ใช้จะไม่มีวิธีดำเนินการต่อ

bashที่อยู่ที่โดยปฏิเสธsuspendว่าเป็นเปลือกเข้าสู่ระบบ แต่ในกรณีของคุณเทอร์มินัลอีมูเลเตอร์ของคุณอาจไม่เริ่มทำงานbashในโหมดลงชื่อเข้าใช้ดังนั้นจึงไม่มีการป้องกัน

zshและmkshไม่ได้มีปัญหาเพราะพวกเขาส่งสัญญาณSIGTSTP(ที่ยังส่งเมื่อCtrl+Z) เช่น csh แทนSIGSTOP(และกลุ่มกระบวนการของผู้โทรmkshเช่นใน csh และกลุ่มกระบวนการหลักของเปลือกzshไม่ใช่$$กระบวนการเพียงอย่างเดียว ) SIGTSTPจะถูกละเว้นเมื่อส่งไปยังกลุ่มกระบวนการที่ถูกละเลยและกลุ่มของผู้นำมีสิทธิ์ แนวคิดคือ SIGTSTP ไม่ควรระงับบางสิ่งที่ไม่สามารถดำเนินการต่อโดยผู้ใช้

ในmkshหรือyashหนึ่งสามารถใช้suspendเพื่อให้ subshell ระงับตัวเอง:

$ (set -x; sleep 1; suspend; sleep 2)
+ sleep 1
+ suspend
[1] + Stopped(SIGSTOP)     (set -x; sleep 1; suspend; sleep 2)
$ fg
[1] (set -x; sleep 1; suspend; sleep 2)
+ sleep 2

ที่จะไม่ทำงานกับzshที่ส่ง SIGTSTP ไปยังกลุ่มกระบวนการหลักแทนการโทร ในเชลล์ใด ๆ ที่มีkillbuiltin เราสามารถใช้kill -s TSTP 0แทนได้เสมอ


4
คุณสามารถอ้างถึงการใช้งานทั่วไปสำหรับการหยุดชั่วคราวคือ: ใน bash (และอาจเป็นจำนวนมากของ shells): เมื่อคุณเริ่มต้นคำสั่งยาวและไม่ต้องการขัดจังหวะ แต่คุณต้องการที่จะทำในพื้นหลัง (เช่นคุณต้องการcommand .... &แต่คุณ ลืม&และตอนนี้หวังว่าคุณจะสามารถเพิ่มได้โดยไม่ต้องขัดจังหวะคำสั่ง): คุณสามารถ: ctrl-zและจากนั้นพิมพ์: bgเพื่อกลับมาทำงานที่ถูกระงับล่าสุดในพื้นหลัง (หรือbg %nทำสิ่งนี้กับหมายเลขงานnใช้jobsเพื่อรับรายการงานที่ถูกระงับหรือทำงานอยู่)
Olivier Dulac

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