이것은 명령 시퀀스입니다. 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 모니터와 동시에 통신할 수 있어야 했습니다.
gedit
superuser 로 실행하려고 하면 sudo
각 사용자의 데스크톱 버스에 연결하지 못하거나 잘못된(수퍼유저의) 데스크톱 버스에 연결하기 때문에 더 재미있는 일이 발생합니다.
누군가 gedit
호출 프로세스를 활성화하는 명령줄 옵션 제공을 제안했습니다.실제 편집기 응용 프로그램gedit
, 따라서 편집기가 환경 변수( 즉시 종료될 때 from to 의 많은 일반적인 용도 EDITOR
에서는 작동하지 않음 )에 의해 지정되므로 이는 유용합니다. 이 제안은 아직 현실이 되지 않았습니다.EDITOR
crontab
git
동시에 gedit
호출에 비공개 인 완전히 새로운 데스크톱 버스 인스턴스를 호출하는 등 다양한 방법으로 "경량 텍스트 편집기"의 두 번째 간단한 인스턴스를 얻을 수 있습니다 dbus-run-session
. 물론, 이는 해당 개인 버스에서 차례로 호출되는 다른 GNOME 데스크탑 버스 서버를 시작하는 경향이 gedit
있어 전혀 "경량"이 아닙니다.
가장 중요한 것은 당신이 따라갈 때입니다이 제안또는 유사한 것으로 쉘 작업 목록에서 프로세스를 gedit
즉시 제거하는 쉘 함수를 삽입하십시오. 나중에 사용하거나 볼 수 gedit
없도록 프로세스가 빨리 종료될 뿐만 아니라 , 쉘은 이를 쉘 제어 작업으로 모니터링하지도 않습니다.kill
ps
추가 읽기
- 응용 프로그램/Gedit/NewSingleInstance. 그놈 위키피디아. 2013년.
- "설명하다"
GApplication
..그놈 개발자 위키. - https://stackoverflow.com/questions/7553452/
- 스테판 뢰플러(2011-05-04). 노틸러스에서 시작할 때 실행 중인 인스턴스를 재사용하지 마세요.. 버그 #777292. 발사대.
답변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