shell 如何结束一个在raspberry打开时自动启动的python程序?

6kkfgxo0  于 2023-05-01  发布在  Shell
关注(0)|答案(1)|浏览(67)

我想知道我是否可以实现一个条件,可以停止一个Python程序,当我打开我的树莓开始运行。我想保存数据,尽快乌藨子是打开,但我将能够停止它时,我决定,像一个CTRL + C在终端上。
谢谢你
我在网上什么都没找到。如果我自己启动代码,我可以用CTRL + C停止它,但是有没有其他方法可以在没有终端窗口的情况下停止Python程序?

fdx2calv

fdx2calv1#

答案在某种程度上取决于你是如何开始的-你可能已经开始了:

  • 作为systemd服务,或
  • /etc/rc.local脚本,或
  • crontab条目

如果您将其作为systemd服务启动,则也可以使用systemd来停止它,如下所示:

sudo systemctl stop YOURSERVICE

如果你用另外两种方法之一启动它,你可能会想用一个信号来停止它,你会通过kill程序发送信号--参见man kill的手册页。为了做到这一点,您可能需要使用它的pid“进程id”,这是操作系统分配给每个进程的唯一编号,用于管理它。您可以使用以下命令查看所有进程ID的列表:

ps -aef

pid在第二列。因此,我们可以启动一个小进程,它会休眠60秒并进入后台,这样我们就可以像这样继续使用终端:

sleep 60 &

然后用下面的代码查找它的pid,小心不要发现自己在找它,用:

ps -aef | grep -v grep | grep sleep

输出示例

501 17016  2906   0 11:49am ttys001    0:00.00 sleep 60

然后杀了它:

kill 17016

这很好,对你来说也很有用,但是查找起来有点痛苦,所以很多守护进程/服务在启动时在文件系统的某个地方写一个pidfile,然后可以更简单地杀死它们。因此,如果在Python数据采集程序的开头添加几行,它可以在名为/tmp/acq.pid的文件中记录自己的pid,如下所示:

from pathlib import Path     # to easily write in a file
import os                    # to get "pid"

# Get pid and write in file
myPID = os.getpid()
Path('/tmp/acq.pid').write_text(str(myPID))

...
rest of your normal code
...

然后你可以随时轻松地杀死它:

pkill -F /tmp/acq.pid

如果它以root启动,则可能需要用途:

sudo pkill -F /tmp/acq.pid

相关问题