Bash / ZSH: Скасування "відхилення"


30

Чи є спосіб "приєднати" процес до таблиці завдань оболонок після того, як він був "відхилений"?

Редагувати: $ SEARCHENGINE повністю мене не дає. Не дуже добре виглядає.

Відповіді:


16

Зважаючи на те, як працюють завдання Linux та права власності на процеси, я боюся, що реально повернути процес не можливо, без допомоги процесу прийняття.

Батько може "відхилити" дитину, яку потім "усиновить" у процесі, який називається "init". Безпека системи не дозволяє комусь захопити чужі процеси. Коли ви відхилилися від нього, процес стає чужим (init's) для контролю. Ви як "користувач" все ще можете вбити процес, але повернути його не можете. Спроба примусити init повернути ваш процес навряд чи спрацює, оскільки init навіть не читає пошту.

Як начебто це звучить, воно дійсно зводиться до відповіді "Не роби цього!".


1
Це не може бути правильним: батьківський процес не може спричинити усиновлення дитини, окрім як виїзду. Поведінка, яку ви описуєте, повинна бути викликана дочірнім процесом (або ядром, яке робить щось з цього автоматично, якщо батько помирає). Процес не може усиновити дитину добровільно, але він також не може відмовитись від неї.
Жил "ТАК - перестань бути злим"

1
Мої вибачення. Моя провина. Надмірно спрощено. Знову пробігшись через джерело bash, bash як і раніше зберігає право власності, але перешкоджає передачі зітху до дочірнього процесу. Тож МОЖЕ бути можливим повернути його назад, але він не вбудований у bash (поки). Чомусь я застряг у пожинанні сиріт та зомбі.
lornix

@lomix Так, але коли ви вийдете з оболонки, ви відмовились від неї, тоді вона отримує 1 ppid, тому ваші міркування є дійсними. хто відмовляється, якщо не збирається все-таки вийти: p
Orwellophile

1
Вибачте, але ця відповідь неправильна. Просто використовуйте reptyr(див. Мою відповідь на прикладі використання).
Крістіан Піетш

18

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

https://github.com/nelhage/reptyr

Ви зможете відредагувати будь-який процес (тобто перемістити його всередині екрана).


2
Ну, я повернув свій відмовлений vim-процес із рептиром, тож він працював так само, як утиліта, яка не знімалася, яку я шукав.
hlovdal

Ви праві, @hlovdal: Ця відповідь напівправильна. reptyrце рішення, але не потрібно припиняти використання disown. Для наочності я написав нову відповідь.
Крістіан Піетш

11

Все, що вам потрібно, це reptyr. Він живе на GitHub і постачається для Debian ще з Wheezy, а також, можливо, і для інших GNU / Linux дистрибутивів. Це виведе на перший план ваш відмовлений процес у поточному терміналі, якщо ви будете викликати його з його ідентифікатором процесу (PID). Так, наприклад:

pgrep -f DISOWNED_PROCESS  # to find out the PID of the disowned process
reptyr PID                 # insert this PID here

2
(sudo apt-get install reptyr) Потім отримав це з першої спроби: "Ядро відмовило у дозволі під час приєднання. Якщо ваш uid відповідає цільовому, перевірте значення / proc / sys / kernel / yama / ptrace_scope. Для отримання додаткової інформації див. /etc/sysctl.d/10-ptrace.conf "Я змінив значення в обох місцях з 1 на 0 і воно працювало. Я перевірив відхилення і перезапис процесу, як і той самий користувач (ipython notebook на ubuntu 14.04 LTS). Можливо, це гаразд для розвитку в ізольованому середовищі ... але не впевнений, що остаточні наслідки зміни можуть бути змінені. Можливо, хтось, хто має досвід, може
зазивати

1

Вибач, ні. В принципі, це було б можливо, оскільки відхилення просто змінює внутрішній стан оболонки - це в основному видаляє ідентифікатор процесу зі списку, і його можна буде повернути без зайвих клопотів (вам доведеться бути трохи обережними при тестуванні, що повторно закріплений під знаходиться в потрібному сеансі, але це непереборно). Але жодна із звичайних оболонок (bash, ksh, tcsh, zsh), здається, не має способу повторного додавання. (Хоча з Zsh ви можете написати на jobstates, jobdirsі jobtextасоціативні масиви, я не знаю , скільки ви можете досягти таким чином.)

Якщо ви хочете, щоб оболонка надсилала сигнали до відключеного процесу, як це робиться для його власних підпроцесів, ви можете написати завдання на заглушку, яке чекає, поки він отримає сигнал, і той самий сигнал відправить до відключеного процесу. Ви можете надіслати SIGSTOPі SIGCONTв відключений процес, щоб імітувати Ctrl+ Zі bg. Нічого з цього не буде настільки зручним, як повторне володіння.


0

Які обставини? Якщо ви просто хочете повернути свій термінал на деякий час, замість цього ви можете скористатися екраном GNU . Це не зовсім відокремлює процес від терміналу - Екран емулює один для вигоди процесу, - але ви можете приєднати та від'єднати його від реального терміналу, який ви використовуєте. Ви навіть можете від’єднати екран, вийти з системи, а потім увійти в систему і знову приєднатись до того ж екрану.


6
Обставини такі: Ви відмовилися від неправильного процесу і хочете його повернути.
nisc

1
Ага. Важче. Екран потрібно спланувати.
Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.