【问题标题】:Reload or restart python script in a bash shell在 bash shell 中重新加载或重新启动 python 脚本
【发布时间】:2020-11-10 20:57:50
【问题描述】:

我是 python 世界的新手,所以不要太快评价我 :-) 我正在尝试强制 python 脚本在 bash 脚本开始时重新加载或重新启动。

我试过了:

pkill -f myscript.py

killall myscript.py

还有其他人……

实际上,我想在更改这些 .wav 文件后运行调用 .wav 文件的相同脚本...如果我不重新加载脚本或重新启动它,它会继续播放旧文件。

也许,还有其他解决方案。 这是我要重新加载的脚本(这是一个为我女儿播放音乐的按钮脚本)

#!/usr/bin/env python3

import pygame
from gpiozero import LED, Button
from signal import pause

pygame.init()

button_sounds = {Button(2): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/1.wav"),
                 Button(3): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/2.wav"),
                 Button(4): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/3.wav"),
                 Button(17): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/4.wav")}

for button, sound in button_sounds.items():
    button.when_pressed = sound.play

pause()

这是我的 bash 脚本:

#!/bin/bash

***HERE THE COMMAND I NEED !***

rm -r /home/pi/gpio-music-box/samples/*
cp -r /home/pi/gpio-music-box/comptines/* /home/pi/gpio-music-box/samples/

/home/pi/gpio-music-box/music.py

非常感谢你,我的英语很不错,我是法国人 :-) 安迪

【问题讨论】:

标签: python bash shell


【解决方案1】:

试试这个

#!/bin/bash

pid=$(ps auxwww | grep nameOfScript.py | grep -v grep | awk '{print $2}')

kill -9 $pid

rm -r /home/pi/gpio-music-box/samples/*
cp -r /home/pi/gpio-music-box/comptines/* /home/pi/gpio-music-box/samples/

nohup /home/pi/gpio-music-box/music.py &

祝你有美好的一天

【讨论】:

  • 它的作用:ps auxwww -> 打印进程 grep nameOfScript.py -> 检索我们想要的行 grep -v grep -> 从选择中删除 grep awk '{print $2}' -> 修剪结果只显示pid
  • 感谢 wagigi,尽管您的命令行有效,但它不会停止进程... pid=$(ps auxwww | grep nameOfScript.py | grep -v grep | awk '{print $2} ') echo $pid 4343 4364 4389 killall -9 4343 4364 4389 >> 无论如何都找不到进程!
  • 你需要使用kill而不是killall
【解决方案2】:

首先,您可以通过使用输出格式来减少 ps 中的很多“噪音”。然后,您还可以使用 awk 进行搜索,从而不再需要同时使用 grep 和 awk。

ps -eo "%p %a" | awk '/nameOfScript.py/ && $1 != PROCINFO["pid"] { print "kill -9 "$1 }'

这会强制 ps 只打印 pid (%p) 和完整的命令 (%a)。然后将输出通过管道传输到 awk,其中搜索包含脚本名称的行。它将当前进程 id 为 awk 的所有条目打折,然后使用它来打印具有相关进程 id 的 kill 命令。

一旦你验证了 kill 命令按预期显示,你就可以使用 awk 的系统函数来实际运行命令:

ps -eo "%p %a" | awk '/prometheous-things.py/ && $1 != PROCINFO["pid"] { system("kill -9 "$1) }'

【讨论】:

    猜你喜欢
    • 2011-03-17
    • 1970-01-01
    • 2011-12-16
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2019-05-10
    相关资源
    最近更新 更多