Process

乾淨地殺死一個程序

  • June 20, 2021

我需要讓Linux Ubuntu平台自動啟動並殺死一個程序,例如,如果時間是早上8點,程序啟動,如果時間是晚上7點,程序會被殺死,那必須是每天,應該沒問題,如果時間間隔將容易改變。

我正在嘗試在 crontab 中使用簡單的程式碼:

28 12 * * * /home/pi/Desktop/start.sh
50 11 * * * pkill led.py

不要看時間,我試圖改變它們,start.sh啟動led.py腳本,但如果我使用pkill -9 -f led.py. 該程序被終止,但 LED 不會關閉。如果我手動啟動程序然後用Ctrl+c將其終止,則 LED 將關閉。哪裡有問題?為什麼我不能終止程序並同時關閉 LED?

當您鍵入Ctrl+c時,通常會向程序發送一個“INT”信號。來自signal(7)

  Signal     Value     Action   Comment
  ──────────────────────────────────────────────────────────────────────
  ...
  SIGINT        2       Term    Interrupt from keyboard

程序為這個信號安裝一個處理程序是很常見的,允許它們在退出之前執行一些清理。對於您的led.py腳本,聽起來這個處理程序關閉了 LED。

預設情況下,pkill發送kill“TERM”(15)信號。(您還嘗試發送“KILL”(9)。)這些信號導致led.py不那麼優雅地消亡,沒有機會執行其完成功能。

為了led.py乾淨地完成,您應該發送“INT”(2)信號,與

pkill -2 [process specifier]

您中的pkill命令crontab也可能無法找到該程序,因為您提供的名稱不是它正在搜尋的名稱。來自pkill(1)

-f,–滿

模式通常僅與程序名稱匹配。設置-f時,將使用完整的命令行。

由於您的腳本,led.py大概是一個 python 腳本,程序名稱只是python(或python3,或類似)。完整的命令行類似於python led.py,因此-f選項可讓您匹配。

pkill -2 -f led.py

引用自:https://unix.stackexchange.com/questions/312640