Linux Ubuntu 플랫폼이 자동으로 프로세스를 시작하고 종료하도록 해야 합니다. 예를 들어 시간이 오전 8시이면 프로세스가 시작되고 시간이 오후 7시이면 프로세스가 종료되며 매일 이렇게 되어야 합니다. 시간 간격이 쉽다면 괜찮을 것입니다. 변경.
crontab에서 간단한 코드를 사용하려고 합니다.
28 12 * * * /home/pi/Desktop/start.sh
50 11 * * * pkill led.py
시간을 보지 말고 스크립트를 start.sh
시작하여 변경하려고 시도했지만 . 프로그램을 수동으로 시작한 다음 + 로 종료 하면 LED가 꺼집니다. 뭐가 문제 야? 왜 프로세스를 종료하는 동시에 LED를 끌 수 없나요?led.py
pkill -9 -f led.py
Ctrlc
답변1
Ctrl+ 를 입력하면 c일반적으로 "INT" 신호가 프로세스로 전송됩니다. ~에서signal(7)
:
Signal Value Action Comment ────────────────────────────────────────────────────────────────────── ... SIGINT 2 Term Interrupt from keyboard
프로세스는 일반적으로 이 신호에 대한 핸들러를 설치하여 종료하기 전에 일부 정리 작업을 수행할 수 있도록 합니다. 스크립트가 진행되는 한 led.py
해당 핸들러가 LED를 끄는 것처럼 들립니다.
기본적으로 "TERM"(15) 신호가 pkill
전송됩니다 . kill
(또한 "KILL"(9) 전송을 시도했습니다.) 이러한 신호는 led.py
그루밍 기능을 실행할 기회 없이 덜 우아한 충돌을 유발합니다.
깔끔하게 하려면 led.py
"INT"(2) 신호를 보내야 합니다.
pkill -2 [process specifier]
pkill
crontab
제공한 이름이 검색 중인 이름이 아니기 때문에 명령이 프로세스를 찾지 못할 수도 있습니다. ~에서pkill(1)
:
-f, --완료
이것무늬일반적으로 프로세스 이름만 일치합니다. 언제-에프일단 설정되면 전체 명령줄이 사용됩니다.
귀하의 스크립트는 led.py
아마도 Python 스크립트일 것이므로 프로세스 이름은 간단히 python
(또는 python3
또는 유사)입니다. 전체 명령줄은 유사 python led.py
하므로 -f
옵션을 사용하여 일치시킬 수 있습니다.
pkill -2 -f led.py
답변2
나는 몇 년 전에 이 기능을 사용했습니다.
function killit () {
for process in "$@"; do
kill -0 $process &>/dev/null
if [[ $? == 0 ]] ; then
sudo kill $process #(sends a TERM, wait 5 seconds)
sleep 5
RUNNING=$(ps aux | tr -s " " "\t" | cut -f 2 | grep $process)
if [[ $RUNNING ]] ; then
echo "$0 WARNING: process $process still running, trying kill again"
sudo kill $process #(yes, try again, wait 5 seconds)
sleep 5
RUNNING=$(ps aux | tr -s " " "\t" | cut -f 2 | grep $process)
if [[ $RUNNING ]] ; then
echo "$0 WARNING: process $process still running, trying kill -INT"
sudo kill -INT $process #(wait for it)
sleep 5
RUNNING=$(ps aux | tr -s " " "\t" | cut -f 2 | grep $process)
if [[ $RUNNING ]] ; then
echo "$0 WARNING: process $process still running, trying kill -INT again"
sudo kill -INT $process #(damn, still not dead?)
sleep 5
RUNNING=$(ps aux | tr -s " " "\t" | cut -f 2 | grep $process)
if [[ $RUNNING ]] ; then
echo "$0 WARNING: process $process still running, trying kill -KILL"
sudo kill -KILL $process #(same thing as -9)
sleep 5
RUNNING=$(ps aux | tr -s " " "\t" | cut -f 2 | grep $process)
if [[ $RUNNING ]] ; then
echo "$0 WARNING: process $process still running, trying kill -KILL again"
sudo kill -KILL $process #(something is wrong)
sleep 5
RUNNING=$(ps aux | tr -s " " "\t" | cut -f 2 | grep $process)
if [[ $RUNNING ]] ; then
echo "$0 WARNING: Can't kill process $process"
logger "$0 WARNING: Can't kill process $process"
fi
fi
fi
fi
fi
fi
fi
done
}