Ubuntu가 종료시 SIGTERM을 보내지 않습니다


21

우분투가 실행중인 응용 프로그램에 응용 프로그램이 올바르게 종료되도록 종료하고 있다고 말하지 않고 강제 종료합니다.

종료 할 때 크롬을 열어두면 부팅 후 다시 열 때 마지막으로 올바르게 닫히지 않았다고 말하면 LibreOffice에서 문서를 저장할 것인지 묻지 않고 코드를 실행 해야하는 응용 프로그램을 만들고 있습니다 컴퓨터가 종료 될 때 종료 할 수는 없습니다.

내가 이해했듯이 SIGTERM은 먼저 모든 프로세스로 전송되어 깨끗하게 종료 할 수 있으며 종료하지 않으면 SIGKILL이 강제 종료됩니다. 우분투가 SIGTERM을 전혀 보내지 않거나 SIGKILL을 보내기 전에 충분한 시간을주지 않은 것 같습니다.

이 문제를 해결할 수있는 방법이 있습니까?

우분투 16.04를 실행하고 있지만 15.10에도 문제가 있습니다. 15.10이 최신 버전 일 때 우분투를 사용하기 시작한 이래로 이전에 존재했는지 알 수 없습니다.

편집 : 나는 Unity를 사용하고 오른쪽 상단의 기어를 누르고 시스템 종료를 선택하여 컴퓨터를 종료하지만 sudo halt터미널에서 실행하는 경우 문제는 동일합니다 .

편집 : 로그 아웃 할 때도 동일한 동작이 관찰됩니다. 내 생각에 신호가 로그 아웃 될 때 전송되어야하므로 종료 및 로그 아웃시 문제가 발생합니다.


어떻게 종료합니까?
terdon

1
크롬 및 LibreOffice와는 SIGTERM 당신이 그것을 원하는 방식으로 처리 할 수있는 처리되지 않습니다
안드레아 Corbellini을

2
나는 당신이 무슨 뜻인지 이해하지 못합니다. 그들이 SIGTERM을 올바르게 취급하고 있지 않다는 것을 의미합니까? 어쩌면 그들은 내 질문에 쓴 것처럼 SIGTERM을 처리하는 프로그램을 작성하고 있지만 그 코드는 절대 실행되지 않는 것 같습니다. Ctrl + C를 누르면 SIGINT가 완벽하게 작동합니다. 나는 여전히 종료 과정에서 실행중인 프로세스를 알리는 데 우분투에 관한 문제가 있다고 생각합니다.
GKraft

1
이 버그와 관련이있을 수 있습니다. # 1448259 시스템 종료시 SIGTERM을 먼저 보내지 않습니까?
JonasCz-복원 모니카

2
모든 응용 프로그램을 수동으로 닫아야하는 번거 로움이 있습니다. 최소화 된 응용 프로그램을 잊어 버리면 어떻게됩니까? 작업을 저장하지 않습니다. 그리고 쉽게 제어 할 수 없거나 생각할 수없는 많은 백그라운드 프로세스가 있습니다. 그들은 스스로를 정리하거나 그들이하고있는 것을 구할 기회를 갖지 않을 것입니다.
GKraft

답변:


3

불행히도, 이런 식으로 작동하지 않습니다. 실제로 신호 처리기가있는 많은 프로그램은 확인 대화 상자를 표시하기 위해 신호를 차단하지 않습니다. 신호 처리는 종종 최소이거나 누락됩니다.

종료하지 않고도 쉽게 시도 할 수 있습니다. SIGTERM을 실행중인 Firefox 또는 LibreOffice 프로세스로 보내십시오.

$ pkill firefox

일반적으로 Firefox는 실제로 닫을 것인지 묻습니다. 또한 일반적으로 오랜 시간 동안 실행 중이고 1GB 이상의 RAM을 사용하는 경우 일반적으로 닫는 데 시간이 걸립니다. 마지막 창을 닫은 후 프로세스가 종료되는 데 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가 부과하는 변경이 필요합니다. OP의 문제를 해결하는 데 도움이되는 더 많은 지식을 가진 사람의 도움이 있으면 좋을 것입니다.


며칠 동안 내 컴퓨터에 액세스 할 수 없으므로 문제가 해결 되어도 시도 할 수 없습니다. 그러한 스크립트를 사용해야합니까? 우분투가 그것을 스스로 처리한다고 생각합니다.
GKraft

동의했다. 그러나 Xubuntu에서는 완벽하게 작동합니다. 예를 들어, 저장되지 않은 문서가 있으면 종료가 무기한 대기합니다.
SR

0

실제로, 모든 창을 닫고 특정 DE에 의존하지 않는 스크립트의 일부는 Ask에서 사용할 수 있습니다. 2 차 및 3 차 답변이 특히 유용합니다. 몇 줄만 더 추가하면 패널이나 데스크탑에서 실행기를 만들면 사용중인 DE에서 작동하는 정상 종료를 달성 할 수 있습니다.

열려있는 모든 창을 정상적으로 닫는 방법


그들은 유망한 것 같습니다. 아마도 비슷한 스크립트를 사용하게 될 것입니다.
GKraft
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.