2015-12-10 3 views
1

У меня есть сценарий first.sh, и этот скрипт вызывает другой скрипт с использованием «./second.sh». В second.sh есть команды для воспроизведения песен. Например, содержание second.sh может быть:Остановка запущенного скрипта bash из другого сценария

игра song1.mp3
игра song2.mp3
...

Я хочу, чтобы остановить скрипт second.sh в определенное время в течение дня проблема заключается в том, что использование killall (и аналогичные команды) не помогает, потому что имя скрипта «second.sh» не входит в список команд при использовании «ps aux ", я вижу только" play song1.mp3 ", а затем" play song2.mp3 "Once song2 начинает играть.

Что можно сделать, чтобы остановить second.sh с помощью команды в терминале? Или, по крайней мере, связать все команды в нем с одним процессом, чтобы я мог убить этот конкретный процесс?

Любая помощь приветствуется, я пробовал много идей, которые я нашел в Интернете, но ничего не работает.

+2

вы должны быть в состоянии видеть как first.sh, так и second.sh с ps aux при запуске second.sh. дважды проверьте имя файла, которое выполняется из скрипта first.sh, чтобы убедиться, что вы ищете правильную вещь. – soupmagnet

+0

. А если вместо того, чтобы убить команду «играть», а также скрипт вызывает команду «играть», вы было просто отрегулировать уровень выходного аудиосигнала в течение того времени, когда вам нужна тишина? – ghoti

+0

Я проверил, я побежал «ps aux | grep second.sh», и ничего не получилось. Все, что я вижу, это отдельные команды по мере их выполнения. –

ответ

0

Потому что ты сказал:

в определенное время в течение дня,

Я бы порекомендовал crontab.

Используйте crontab -e и добавьте строку ниже

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

Это убивает родительскую оболочку, которая вызывается play

Синтаксис файла кронтаб является

m h dom mon dow command 

где:

м - минута
ч - часы
дом - день месяца
пн - месяц
доу - день недели
команды - команды, которые вы хотите выполнить.

Редактировать

Или вы могли бы сделать что-то вроде этого:

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

который приостановит все play процессы с 12 часов до 16 часов.

Требование

Вы должны иметь демон cron и работает на вашей системе.

+0

Есть 2 проблемы: 1) second.sh не отображается в списке запущенных процессов, поэтому использование killall не будет работать. 2) пауза и остановка воспроизведения вызовут только вторую команду «play» в «second.sh» для запуска –

+0

@HadilCharafeddine: см. Мое редактирование. – sjsam

+0

Сейчас я попробую! –

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 
0

Вам просто нужно остановить second.sh, и он автоматически уничтожит все дочерние процессы.

killall second.sh