从另一个脚本停止正在运行的bash脚本

时间:2015-12-10 16:20:41

标签: linux bash shell scripting kill-process

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

play song1.mp3
play song2.mp3
...

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

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

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

3 个答案:

答案 0 :(得分:0)

因为你说:

  

在白天的某些时间,

我建议crontab

使用crontab -e并附加以下行

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

这会终止调用play

的父shell

crontab文件的语法是

m h  dom mon dow   command

<强>其中:

<分钟 - 分钟 h - 小时
dom - 月份日 周月月 dow - 星期几 command - 您希望执行的命令。

修改

或者你可以这样做:

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

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

<强>要求

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

答案 1 :(得分:0)

您可以显式保存进程的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 ...

third.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

答案 2 :(得分:0)

您只需要停止second.sh,它将自动终止其所有子进程。

killall second.sh