추가 읽기

추가 읽기

이것은 명령 시퀀스입니다. gedit시작되지만 해당 프로세스 ID에서 종료할 수는 없습니다.

$ gedit&
$ t=$!
$ echo $t
4824
$ kill $t
bash: kill: (4824) - No such process

sleep다음과 같은 프로세스에 적합합니다 .

sleep 999&
[1] 4881
$ t=$!
$ echo $t
4881
$ kill $t
$ ps -p $t
[1]   Terminated              sleep 999

차이점은 무엇입니까? gedit프로세스를 종료하는 방법은 무엇입니까 ?

답변1

gedit이것이미종료.

Win32가 등장하고 이를 없애기 전 Win16일을 기억해 보세요. Windows 응용 프로그램이 주로 어떻게 작동했는지 기억해 보십시오 hInstance. hPrevInstance명령 스크립트 도구(예: Take Command)를 사용하면 응용 프로그램을 두 번째로 호출하고 화면에 분명히 추가된 창으로 표시되지만 명령 해석기에 관한 한 방금 실행한 하위 프로세스가 즉시 종료됩니까?

GNOME은 Linux용 Win16 동작을 복원합니다.

이와 같은 GIO 애플리케이션의 경우 gedit애플리케이션은 다음과 같이 작동합니다.

  • org.gnome.gedit사용자별/로그인별 데스크톱 버스에 명명된 등록 "서버"가 없으면 gedit첫 번째 인스턴스로 결정됩니다. 그것~이 되다서버를 org.gnome.gedit계속 실행하세요.
  • org.gnome.gedit사용자별/로그인별 데스크톱 버스에 이미 명명된 등록 "서버"가 있는 경우 gedit두 번째 또는 후속 인스턴스로 결정됩니다. 명령줄 옵션과 인수를 전달하여 첫 번째 인스턴스에 대한 데스크톱 버스 메시지를 구성합니다.그런 다음 간단히 종료하세요..

따라서 표시되는 내용은 gedit서버가 이미 실행 중인지 여부에 따라 달라집니다. 이 작업을 수행하지 않았다면 Seviera의 입장에서 설명된 동작을 왜 보지 못했는지 궁금해할 것입니다. 만약 그렇다면, 당신은 당신의 위치에 있고 프로세스가 gedit거의 즉시 종료되는 것을 보게 될 것입니다. 특히 "첫 번째 인스턴스"로 보낼 명령줄 옵션이나 매개 변수를 제공하지 않았기 때문입니다. 따라서 더 이상 해당 ID를 가진 프로세스가 없습니다.

위에서 언급했듯이 로그인별 데스크톱 버스가 "새로운" 스타일의 사용자별 데스크톱 버스로 전환되고 갑자기 데스크톱 버스와 X 디스플레이 사이에 더 이상 1:1 관계가 없게 되면 많은 재미가 발생합니다. 더. 단일 사용자 버스 범위 인스턴스 애플리케이션이 갑자기 여러 X 모니터와 동시에 통신할 수 있어야 했습니다.

geditsuperuser 로 실행하려고 하면 sudo각 사용자의 데스크톱 버스에 연결하지 못하거나 잘못된(수퍼유저의) 데스크톱 버스에 연결하기 때문에 더 재미있는 일이 발생합니다.

누군가 gedit호출 프로세스를 활성화하는 명령줄 옵션 제공을 제안했습니다.실제 편집기 응용 프로그램gedit, 따라서 편집기가 환경 변수( 즉시 종료될 때 from to 의 많은 일반적인 용도 EDITOR에서는 작동하지 않음 )에 의해 지정되므로 이는 유용합니다. 이 제안은 아직 현실이 되지 않았습니다.EDITORcrontabgit

동시에 gedit호출에 비공개 인 완전히 새로운 데스크톱 버스 인스턴스를 호출하는 등 다양한 방법으로 "경량 텍스트 편집기"의 두 번째 간단한 인스턴스를 얻을 수 있습니다 dbus-run-session. 물론, 이는 해당 개인 버스에서 차례로 호출되는 다른 GNOME 데스크탑 버스 서버를 시작하는 경향이 gedit있어 전혀 "경량"이 아닙니다.

가장 중요한 것은 당신이 따라갈 때입니다이 제안또는 유사한 것으로 쉘 작업 목록에서 프로세스를 gedit즉시 제거하는 쉘 함수를 삽입하십시오. 나중에 사용하거나 볼 수 gedit없도록 프로세스가 빨리 종료될 뿐만 아니라 , 쉘은 이를 쉘 제어 작업으로 모니터링하지도 않습니다.killps

추가 읽기

답변2

죄송하지만 이것은 저에게 효과적이었습니다.

$ gedit&
[1] 9391
$ t=$! 
$ echo $t
9391
$ kill $t
[1]+  Terminated         gedit

ps -ef프로세스가 아직 존재하는지 실행하거나 확인합니다 pidof gedit. 그렇다면 이렇게도 할 수 있습니다kill $(pidof gedit)

답변3

다음 코드를 시도했는데 스크립트에서 작동합니다. 시도해 보세요.

     gedit&
     t=$! 
     echo $t
    #sleep 2
     kill -9 $t

관련 정보