Ubuntu не відсилає SIGTERM при відключенні


21

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

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

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

Чи я можу це виправити?

Я працюю на Ubuntu 16.04, але проблема існувала і в 15.10. Я не можу сказати, чи було це раніше, оскільки я почав використовувати Ubuntu, коли 15.10 була новітньою версією.

Редагувати: я використовую Unity та вимикаю комп'ютер, натискаючи на шестерню у верхньому правому куті та вибираючи вимкнути, хоча проблема однакова, якщо працює sudo haltу терміналі.

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


Як ви закриваєтесь?
тердон

1
Chromium та LibreOffice не поводяться з SIGTERM так, як ви хочете, щоб це обробляли
Андреа Корбелліні

2
Я не впевнений, що розумію, що ти маєш на увазі. Ви маєте на увазі, що вони неправильно поводяться з системою SIGTERM? Можливо, вони цього не роблять, але, як я писав у своєму запитанні, я працюю над програмою, яка працює з SIGTERM, але цей код ніколи не запускається. SIGINT під час натискання клавіші ctrl + C прекрасно працює. Я все ще вважаю, що існує певна проблема щодо Ubuntu сповіщення про запущені процеси про вимкнення.
GKraft

1
Можливо, пов’язано з цією помилкою: # 1448259 Systemd не надсилає SIGTERM спочатку при відключенні ?
JonasCz

2
Дратівливо закривати всі програми вручну, а що робити, якщо ви забудете мінімізовану програму? Це не збереже вашу роботу. І є безліч фонових процесів, які ви або не можете легко контролювати, або не замислюєтесь. Їм не дадуть шансу прибрати за собою або врятувати все, що вони робили.
GKraft

Відповіді:


3

На жаль, це не зовсім так працює. Багато хто з програм, які насправді мають обробник сигналу, не блокують сигнал, щоб не з’являлося діалогове вікно підтвердження. Обробка сигналів часто мінімальна або відсутня.

Ви можете легко спробувати його без відключення. Просто надішліть SIGTERM до запущеного процесу Firefox або LibreOffice:

$ pkill firefox

Зазвичай Firefox може запитати, чи дійсно ви хочете його закрити. Крім того, зазвичай потрібно деякий час, щоб закрити, особливо коли він працює тривалий час і використовує більше 1 ГБ оперативної пам’яті - це часто потребує хвилини, щоб процес закінчився після закриття останнього вікна. Нічого цього не відбувається, коли ви надсилаєте SIGTERM, процес просто миттєво припиняється.

Однак деякі середовища робочого столу закривають усі відкриті вікна, перш ніж вимикатися. На відміну від SIGTERM, програмно закривати вікно - це як натиснути кнопку X у цьому вікні або Alt+ F4. Це також те, що робить сценарій в іншій відповіді - він використовує wmctrl, щоб граціозно закрити всі відкриті вікна.

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

Отже, це залежить від вашого робочого середовища (якщо ви використовуєте робоче середовище для відключення, а не sudo poweroff). Наприклад, KDE має чекати, коли відкриті вікна будуть закриті перед тим, як вимкнутись, тоді як MATE цього не зробить.

Підсумок: закрийте всі відкриті вікна вручну перед тим, як вимкнутись. Або скористайтеся робочим середовищем, яке очікує закриття всіх вікон.


Я бачу, що процес вимикання та обробка сигналів не спрацювали так, як я думав. Тепер я розумію, як це має працювати і чому він не працював так, як я очікував.
GKraft

0

Для чого це варто, якийсь час тому я знайшов цю процедуру на форумі Manjaro:

close_apps () {
WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
for i in $WIN_IDs; do wmctrl -ic "$i"; done

# Keep checking and waiting until all windows are closed
while [ "$WIN_IDs" != "" ]; do
        sleep 0.1;
        WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done

}

Ви можете зателефонувати за власним сценарієм, щоб закрити всі відкриті додатки до вимкнення (або перезавантаження).

Єдина проблема: вона створена для Xfce, тому вона потребує змін, які нав'язує Unity DE. Тут допоможе допомогти незнайома людина з більш обізнаними, щоб допомогти вирішити проблему ОП.


Я не матиму доступу до свого комп’ютера пару днів, тому не можу спробувати його, навіть якщо його виправлено. Чи справді слід використовувати такий сценарій? Я думаю, що ubuntu shoukd впорається сам.
GKraft

Домовились. Хоча це чудово працює в Xubuntu. Наприклад, закриття буде чекати нескінченно, якщо є збережений документ.
SR

0

Насправді частина сценарію, яка закриває всі вікна та не залежить від конкретного DE, доступна у Ask. Особливо корисні дві та треті відповіді. За допомогою лише декількох рядків більше, а також створивши пускову панель на панелі або на робочому столі, ви зможете досягти витонченого відключення, яке працює в DE, який ви використовуєте.

Як граціозно закрити всі відкриті вікна


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