我有一个名为 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 ?或者至少将其中的所有命令绑定到一个进程,以便我可以杀死该特定进程?
感谢任何帮助,我尝试了很多我在网上找到的想法,但似乎没什么用。
答案 0 :(得分:0)
因为你说:
在白天的某些时间,
我建议crontab
。
使用crontab -e
并附加以下行
0 12 * * * kill -9 `ps aux | awk '/play/{print $2}'`
这会终止调用play
crontab文件的语法是
m h dom mon dow command
<强>其中:强>
<分钟 - 分钟 h - 小时修改强>
或者你可以这样做:
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