【问题标题】:Stopping a running bash script from another script从另一个脚本停止正在运行的 bash 脚本
【发布时间】:2015-12-10 16:20:40
【问题描述】:

我有一个名为 first.sh 的脚本,该脚本使用“./second.sh”调用另一个脚本。 second.sh 中有播放歌曲的命令。例如,second.sh 的内容可以是:

play song1.mp3
play song2.mp3
...

我想在一天中的某些时间停止脚本 second.sh,问题是使用 killall(和类似命令)没有帮助,因为名称当我使用“ps aux”时,脚本“second.sh”没有出现在命令列表中,我只看到“play song1.mp3”,然后在 song2 开始播放时“play song2.mp3”。

如何在终端中使用命令停止 second.sh?或者至少将其中的所有命令绑定到一个进程,以便我可以终止该特定进程?

感谢任何帮助,我尝试了很多我在网上找到的想法,但似乎没有任何效果。

【问题讨论】:

  • 当 second.sh 运行时,您应该能够通过 ps aux 看到 first.sh 和 second.sh。仔细检查从 first.sh 脚本执行的文件名,以确保您正在搜索正确的内容
  • 如果不是杀死“播放”命令,连同调用“播放”命令的脚本,您只需在一天中需要的时间调整音频输出电平,那该怎么办?沉默?
  • 我确实检查过,我运行了“ps aux | grep second.sh”,但没有任何反应。我所看到的只是正在执行的各个命令。

标签: linux bash shell scripting kill-process


【解决方案1】:

因为你说:

在一天中的特定时间,

我会推荐crontab

使用crontab -e 并附加以下行

0 12 * * * kill -9 `ps aux | awk '/play/{print $2}'`

这会杀死调用play的父shell

crontab 文件的语法是

m h  dom mon dow   command

地点:

m - 分钟
h - 小时
dom - 月份中的某天
周一 - 月
道 - 星期几
command - 您希望执行的命令。

编辑

或者你可以这样做:

0 12 * * * killall -sSIGSTOP play
0 16 * * * killall -sSIGCONT play

这将暂停所有 play 进程从 12 小时到 16 小时。

要求

您需要在系统上启动并运行 cron 守护程序。

【讨论】:

  • 这个有2个问题:1)second.sh没有出现在正在运行的进程列表中,所以使用killall是不行的。 2)暂停和停止播放只会导致“second.sh”中的第二个“play”命令运行
  • 我现在就试一试!
  • 成功了!!谢谢!!播放在指定时间暂停(并且脚本没有移动到下一个播放命令),然后在指定时间恢复。这就是我需要的!非常感谢!
【解决方案2】:

您可以显式保存进程的pgid,然后使用信号SIGSTOP和SIGCONT来启动和停止进程组。

first.sh

#!/bin/bash

nohup ./second.sh > /dev/null 2>&1 &
echo $$ > /tmp/play.pid ### save process group id

second.sh

#!/bin/bash

play ...
play ...

第三个.sh

#!/bin/bash

case $1 in
    (start)
        kill -CONT -$(cat /tmp/play.pid)
        ;;

    (stop)
        kill -STOP -$(cat /tmp/play.pid)
        ;;
esac

现在您可以按如下方式启动和控制播放:

./first.sh

./third.sh stop
./third.sh start

【讨论】:

    【解决方案3】:

    你只需要停止 second.sh ,它就会自动杀死它的所有子进程。

    killall second.sh
    

    【讨论】:

      猜你喜欢
      • 2018-02-04
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 2016-03-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      相关资源
      最近更新 更多