Что значит присоединить процесс к терминалу? [закрыто]

У меня сработало установить метод ускорения моего драйвера Intel на uxa .

Создав /etc/X11/xorg.conf.d/20-intel.conf С содержанием:

Section "Device"
   Identifier  "Intel Graphics"
   Driver      "intel"
   Option      "AccelMethod"  "uxa"
EndSection

Я получил это из здесь . Это вызывало сбои в моем VirtualBox, но также и в моем Firefox.

Вы также можете проверить это . Может быть, это относится к вам.

3
10.08.2018, 01:01
1 ответ

ЗАМЕЧАНИЕ:Чтобы получить хорошее руководство по управлению заданиями в Unix, я бы направил вас на страницу Википедии по теме-Управление заданиями (Unix).


Терминал подключен?

Фразу «присоединен к терминалу» обычно можно услышать, говоря о заданиях в контексте оболочки. Но у него есть и другие значения. Фраза «присоединить процесс к терминалу» также может означать использование инструмента, такого как gdb, straceили lsof, для присоединения к определенному идентификатору процесса (PID )и вывода информации или ее мониторинга.

Я расскажу об обоих, но для начала расскажу об очередях заданий, так как подозреваю, что это то, что вы ищете.

Фон -очереди заданий

В Unix, как и в операционных системах, обычно используется концепция заданий. В большинстве Unix-подобных операционных систем, которые я использовал, все они обычно работают одинаково. То есть они могут быть фоновыми и им может быть присвоен номер в очереди (очереди заданий ), и на них можно воздействовать из контекста их номера в этой очереди заданий.

Чтобы поместить что-то в очередь заданий, они обычно называют это действие фоновым. Когда вы возобновляете работу, которая была переведена в фоновый режим, вы называете это приоритетным. Обычно для этого используются команды bgи fg. Вы также можете сразу переводить задания в фоновый режим, используя амперсанд &в конце любой выполняемой вами команды.

Примеры

вакансии

$ sleep 2 &
[1] 19189

Здесь я запускаю команду сна на 2 секунды и запускаю ее в фоновом режиме.Вывод немедленно дает вам полезную информацию, такую ​​как номер очереди заданий([1])и идентификатор процесса фонового задания, 19189.

Когда это задание в конечном итоге завершится, оно напечатает сообщение этого типа в терминале, с которого оно было запущено:

$
[1]+  Done                    sleep 2

передний план и фон

Для работы с фоновыми заданиями:

$ sleep 20 &
[1] 19207

$ fg
sleep 20
^C

Здесь я отправил задание на задний план (&), затем вернул его на передний план (fg), а затем уничтожил с помощью команды Ctrl + C (^C).

Если бы у нас было несколько фоновых заданий:

$ sleep 20 &
[1] 19224
$ sleep 20 &
[2] 19225
$ sleep 20 &
[3] 19226
$ jobs
[1]   Running                 sleep 20 &
[2]-  Running                 sleep 20 &
[3]+  Running                 sleep 20 &

Их можно увидеть с помощью команды jobs. Обратите внимание на маленькие +и -рядом с #3 и #2. Если я запущу команду fgбез указания номера очереди заданий, я получу последнее задание, которое было помещено в задание. очередь(+). Например:

$ fg
sleep 20
^C

$ jobs
[1]-  Running                 sleep 20 &
[2]+  Running                 sleep 20 &

убийство

Вы можете использовать номера очереди заданий для обработки заданий. Один из таких способов — убить их. Чтобы сослаться на номер очереди заданий, вы добавляете к ним префикс %, если вы хотите сослаться на них с помощью других команд, таких как kill. Можно конечно killнесколько сразу или только один:

$ kill %3 %4 %5
$ jobs
[3]   Terminated              sleep 20
[4]   Terminated              sleep 20
[5]-  Terminated              sleep 20
[6]+  Running                 sleep 20 &

Фоновое подключение к PID

Присоединение процесса к терминалу также может означать следующее. Вот PID моей оболочки:

$ echo $$
23543

В другой оболочке я запускаю straceи подключаюсь к этому процессу, чтобы посмотреть, какие системные вызовы он делает:

$ strace -p 23543
strace: Process 23543 attached
read(0,

ПРИМЕЧАНИЕ.:Здесь видно, что он ожидает команды в read. Это то, что делают терминалы/оболочки.

Здесь мы видим, что я начал вводить команду lsвнутри нее, и оболочка повторяет этот отказ в оболочке в виде системных вызовов write().

read(0, "l", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "l", 1)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "s", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "s", 1)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0,

Это еще одна форма присоединения процесса к терминалу.

Другие формы

Здесь также можно предположить одну из наиболее неясных ссылок на присоединение процесса к терминалу. Этот вопрос и ответ U&L под названием:Как подключить терминал к отдельному процессу? охватывает его во всех его формах.

Основная предпосылка этой формы ссылки заключается в том, что вы взяли фоновое задание и «отключили» его от текущей оболочки. Вы делаете это с помощью команд nohupили disown.

После того, как процесс был отклонен, вы больше не можете использовать команды jobs, fgили bgдля воздействия на него. Он больше не связан с PID вашей текущей оболочки.

Традиционным методом повторного -получения ранее отвергнутого процесса является использование такого инструмента, как reptyr, который повторно -прикрепит PID к вашей существующей оболочке. Например, скажем, мы запускаем 2 задания и nohupих:

$ nohup sleep 200 &
[1] 19720
$ nohup sleep 200 &
[2] 19721

Все еще подключены к очереди заданий нашего терминала, давайте disownих:

$ jobs
[1]-  Running                 nohup sleep 200 &
[2]+  Running                 nohup sleep 200 &
$ disown -a

Теперь их нет:

$ jobs
$

Они по-прежнему указаны как дочерние PID нашей исходной оболочки (23543):

$ ps -eaf|grep -E "19720|19721"
vagrant  19720 23543  0 18:29 pts/1    00:00:00 sleep 200
vagrant  19721 23543  0 18:29 pts/1    00:00:00 sleep 200

Теперь, если мы выйдем и снова войдем в систему, мы увидим, что эти процессы теперь перечислены как родительские для основного PID, 1:

$ ps -eaf|grep -E "19720|19721"
vagrant  19720     1  0 18:29 ?        00:00:00 sleep 200
vagrant  19721     1  0 18:29 ?        00:00:00 sleep 200

Эти процессы смогли сделать это, потому что мы nohupредактировали их и disownредактировали их. Давайте снова прикрепим один из них:

$ reptyr -s 19720
[-] Timed out waiting for child stop.

^C

ПРИМЕЧАНИЕ.:В приведенном выше примере я снова подключил PID 19720 к своей оболочке, а затем убил его с помощью Ctrl + C . Мы видим, что его больше нет:

$ ps -eaf|grep -E "19720|19721"
vagrant  19721     1  0 18:29 ?        00:00:00 sleep 200
7
27.01.2020, 21:15

Теги

Похожие вопросы