Яка мета вбудованої команди bash `suspend`?


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
уникайте запуску зовнішніх програм (вбити) для призупинення.
Іпор Сірсер

Відповіді:


23

Якщо запустити оболонку з іншої оболонки, можна призупинити внутрішню. Скажіть, коли користуєтесь suі хочете на мить перейти до звичайного користувача:

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

(Якщо ви це зробите, не забудьте привілейовану оболонку, відкриту на задньому плані ...)

Аналогічно, якщо ви переходите до оболонки з якоїсь іншої програми ( !команда в напр. less), Ви все одно можете призупинити оболонку. Але я б не очікував, що багато інших програм добре впораються з цим під час запуску підпроцесу, який потім призупиняє себе.


1
Я просто спробував запустити vimі зробив a, :shщоб отримати підзарядку (конкретно, zshнижню частину). Біг suspendпідскакував мені в оригінальній оболонці (вона призупиняла і нижню частину, і vim).
Кевін

1
@Kevin, zshздається розумнішим у цьому bash, я намагався втекти і з обох, lessі з vi(Debian vim.tiny): zshзупинив також батьківський додаток, bashповісив усе. bashдо bashробіт , хоча.
ilkkachu

1
я не знав, що те, що я ввожу sudo su subhell, запускається. коли я набрав призупинити в основній оболонці, оболонка просто застигає, але як ви показали, коли я додаю її всередині нижньої оболонки, я автоматично повертаюся до основної оболонки.
акулант

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ймовірно , був той, який розпочався безпосередньо емулятором терміналу. І ваш емулятор терміналу не очікував, що процес буде призупинено.

Це bashбув ведучий сесії. Якщо ведучого сеансу буде призупинено, якщо ми переглянемо старі термінали часу, користувач не зможе відновити його.

bashадреси, відмовляючись, suspendякщо це оболонка для входу. Але у вашому випадку ваш термінальний емулятор, ймовірно, не запускається bashв режимі входу, так що захисна програма не встановлена.

zshі mkshу вас немає проблеми, оскільки вони надсилають SIGTSTP(той, що також надсилається Ctrl+Z) сигнал, як csh замість SIGSTOP(і до групи процесів абонента для, mkshяк у csh, і до основної групи процесів оболонки для zsh, а не самого $$процесу ). SIGTSTPігнорується, коли доставляється до осиротілої групи, і група ведучого кваліфікується. Ідея полягає в тому, що SIGTSTP не повинен призупиняти те, що користувач не може відновити.

У mkshабо yashтакож можна скористатись suspendтим, що підзарядка сама призупиняє:

$ (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 до основної групи процесів замість абонента. У будь-якій оболонці, яка має killвбудований, завжди можна використовувати kill -s TSTP 0замість цього.


4
Ви можете навести загальне використання для призупинення: у bash (і, ймовірно, багато снарядів): коли ви запустили довгу команду, і не хочете її переривати, але побажали, що ви зробили це на задньому плані (тобто, ви хочете, command .... &але ви забув &і тепер бажаю, щоб ви могли його додати, не перериваючи команду): you can:, ctrl-zа потім наберіть: bgщоб відновити останню призупинену задачу у фоновому режимі. (або bg %nробити це за номером завдання n. Використовуйте, jobsщоб отримати список призупинених або запущених завдань)
Олів'є Дулак

5
@OlivierDulac, це не пояснить, для чого потрібна фактична suspend команда .
Wildcard
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.