Linux Ubuntu 플랫폼이 자동으로 하나의 프로세스를 시작하고 종료하도록 해야 합니다. 예를 들어 시간이 오전 8시이면 프로세스가 시작되고 오후 7시이면 프로세스가 종료되며 매일 수행되어야 하며 시간 간격이 충분하다면 꽤 괜찮을 것입니다. 변경하기 쉽습니다.
crontab에서 간단한 코드를 사용하려고 합니다.
28 12 * * * /home/pi/Desktop/start.sh
50 11 * * * pkill led.py
시간을 보지 마십시오. 변경하려고 시도하고 스크립트를 start.sh
시작했지만 . 프로세스가 종료되지만 LED는 꺼지지 않습니다. 프로그램을 수동으로 시작한 다음 + 를 사용하여 프로그램을 종료하면 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, --full
그만큼무늬일반적으로 프로세스 이름과만 일치합니다. 언제-에프설정되면 전체 명령줄이 사용됩니다.
귀하의 스크립트는 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
}