나는 manqge HLTV 서버를 위한 작은 systemctl 서비스를 만들었습니다(게임 내 데모를 기록하고 디스크에 저장합니다).
[Unit]
Description=HLTV server
Requires=cs16.service
After=cs16.service
[Service]
Type=simple
User=cs16
Group=cs16
UMask=007
ExecStart=/home/cs16/server/hltv_start.sh
Restart=on-failure
# Configures the time to wait before service is stopped forcefully.
TimeoutStopSec=300
[Install]
WantedBy=multi-user.target
잘 작동하지만 시스템 서비스를 종료/다시 시작하면 프로세스가 종료되어 현재 작성 중인 데모가 손상됩니다.
데모를 올바르게 저장하려면 htlv 명령 도구에 "quit" 또는 "stop"을 입력해야 합니다. systemctl이 프로그램을 닫기 전에 명령 중 하나를 프로그램에 보내도록 하는 방법이 있습니까?
답변1
기본적으로 프로세스인 경우 systemctl stop
systemd는 SIGTERM을 프로세스에 보냅니다. 프로세스는 신호를 처리하고 정상적으로 종료하는 역할을 담당합니다. 프로세스가 90초 이내에 종료되지 않으면 SIGKILL은 프로세스를 강제 중지합니다.
이 기본 동작을 변경하는 방법에는 여러 가지가 있습니다.
ExecStop=
: 프로세스가 일반적으로 소켓, 공유 메모리, 터치 파일의 외부 신호를 통해 종료되는 경우 를 사용하여 해당 신호를 프로세스에 보내는 스크립트를 실행할 수 있습니다ExecStop=
.KillSignal=
: 프로세스가 SIGTERM에 제대로 응답하지 않는 경우 프로세스에 보낸 신호 변경을 사용할 수 있습니다KillSignal=
. 프로세스가 SIGINT, SIGABRT 또는 SIGQUIT에 더 잘 응답할 수도 있습니다. 이 신호는 프로그램이 수행할 저장을 시작해야 한다는 점에 유의하십시오.TimeoutStopSec=
, 기본값은 90초로 첫 번째 와KillSignal
사이의 시간을 제공합니다FinalKillSignal
. 300초로 늘렸네요. 일반적으로 저장 시간이 이보다 오래 걸리는 경우 시간을 늘리세요. 이것이 저장에 대한 기대치를 초과하는 경우 프로세스가 현재 에 응답하지 않을 수 있습니다KillSignal=
.SendSIGKILL=
: 프로세스가 저장을 시작했지만 무기한 대기하려는 경우no
서비스가 영원히 중단되도록 설정할 수 있습니다. (먼저 플레이하세요TimeoutStopSet
).FinalKillSignal=
TimeoutStopSet
: killsignal이 제대로 작동하지 않고 다른 조치를 취하고 싶다면SIGKILL
여기에서 코드를 설정할 수 있습니다.
프로세스를 서비스로 실행하지 않는 경우 일반적으로 프로세스를 중지하는 방법을 생각해 보십시오. 그런 다음 소송을 따르십시오. CTRL+D
터미널에서 사용하시나요 ? kill
프로세스가 있나요 ?
프로세스가 로 시작되므로 ExecStart=/home/cs16/server/hltv_start.sh
을 원할 수도 있습니다 ExecStop=/home/cs16/server/hltv_stop.sh
.
데모를 올바르게 저장하려면 htlv 명령 도구에 "quit" 또는 "stop"을 입력해야 합니다.
이 명령 도구는 명령줄 응용 프로그램입니까? 그렇다면 다음이 필요할 수도 있습니다.
ExecStop=/home/cs16/server/hltv_command_tool.sh -c stop
이 도구가 HLTV GUI의 일부인 경우 quit
창 관리자를 통해 보내거나 문자 메시지를 보낼 수 있습니다. stop
다음 명령은 bash
셸을 실행한 다음 제목에 in이 포함된 창을 xdotool
검색하는 데 사용됩니다. hltv
그런 다음 quit
해당 창에 입력하고 다음을 누릅니다 Enter
.
ExecStop=/bin/bash -c 'xdotool type --window "$(xdotool search hltv | head -1)" quit && xdotool key --window "$(xdotool search hltv | head -1)" Enter'
답변2
그것은 서비스가 되어서는 안 된다
작업에 심각한 피해를 주지 않고는 종료할 수 없는 작업은 "서비스"로 실행해서는 안 되며 작업별 스크립트나 프로세스로 실행해야 합니다.
당신이 하려는 일은 인터넷이 systemctl stop apache2
사이트 자체를 완료하기 전에 사이트에 대한 요청을 중지할 때까지 기다리는 것과 같습니다.
로컬 시스템의 경우 시스템을 종료해야 하는 경우 파일 쓰기를 계속할 수 없습니다. 당신이 이것을 하기로 결정했다면, 당신은생각하다 systemctl
서비스가 종료될 때까지 기다릴 필요가 없습니다.
어쩌면 서비스가 종료를 기다리는 다른 스크립트를 실행해야 할 수도 있습니다.
솔루션은 제품 로드맵에 있을 것입니다. 즉, 개발자가 제품 관리자에게 어떤 사용자 경험이 불가능하고 어떤 경험을 경험해야 하는지 알려주도록 하는 것입니다.
hltv_start.sh
이 질문에 다음 제안으로 답변하고 있지만 스크립트 를 공유하지 않았기 때문에 스크립트 내용을 알 수 없습니다 . 따라서 그것이 문제의 핵심이 되어서는 안 됩니다. 그래서 저는 이러한 브레인스토밍을 넘어서 구체적으로 말할 수는 없습니다...
고려하다:
- 렌더링을 마친 후 시스템을 종료하는 옵션과 유사한 스크립트 방식을 사용하여 GUI에서 Kdenlive 기능을 구현합니다. 스크립트를 조정하여 파일 쓰기를 시작한 다음 다음을 통해 서비스를 자동으로 종료할 수 있습니다.
systemctl stop
뒤쪽에문서 작성을 마쳤습니다. wait
종료하기 전에 쓰기 프로세스가 완료되도록 작업별로 파일을 쓰는 스크립트를 만듭니다 .systemctl
파워 무브로 프로세스를 종료 하려면 별도의 스크립트를 작성하세요.~해야 한다중간 파일 처리를 중지합니다.- 서비스를 포함해야 하는 경우 실제로 작성하는 대신 "듣기" 또는
wait
필요한 경우 종료 스크립트를 호출하는 서비스를 사용하십시오. - 서비스가 단지 "수신"한 다음 파일에 쓰는 다른 스크립트를 실행하는 경우 이론적으로 는 쓰기 작업이 완료되도록 허용하면서 서비스를 제공
wait
할 수 있습니다 . 이것이 여러분의 목표라고 가정합니다.systemctl stop