Остановка запущенного скрипта через другой файл скрипта

Я новичок в сценариях оболочки. Скажем, я запускаю такой скрипт. Это работает в течение 3 дней. Итак, я буду запускать скрипт удаленно через ssh, а затем закрою свой локальный терминал.

start.sh

end=$((SECONDS+259200))
x=1
while [ $SECONDS -lt $end ]
do
    #Some command
done

Как я напишу stop.sh остановить сценарий всякий раз, когда я хочу остановить его? Я могу изменить start.sh а также при необходимости.

1 ответ

Решение

Несколько способов:

Убейте любой экземпляр скрипта:

pkill -f start.sh

Это убьет любой процесс с start.sh в командной строке, используя pkill,

Убейте конкретный экземпляр скрипта:

Измените скрипт, чтобы сохранить его PID где-нибудь:

#! /bin/bash
echo $$ >> /tmp/start_sh.pid
end=...

И скажи stop.sh чтобы убить процесс с PID там:

#! /bin/bash
kill $(cat /tmp/start_sh.pid) || echo "Process is not running."

Это убьет всех script.sh процессы.

Общаться с start.sh

Расскажи start.sh читать из некоторого файла, говорящего о выходе:

#! /bin/bash
...
while [ $SECONDS -lt $end ]
do
    [[ $(cat ~/kill_start.txt) == "KILL" ]] && exit 1
    ...

И скажи stop.sh записать "KILL" в этот файл:

#! /bin/bash   
echo "KILL" > ~/kill_start.sh

Это убьет все случаи start.sh, когда выполняется следующая итерация каждого сценария.

(Несмотря на название kill_start.sh это не сценарий.)

Используйте именованные каналы для общения

Кроме того, вы можете запустить фоновое задание в сценарии, чтобы отслеживать изменения в ~/kill_start.sh:

#! /bin/bash
...
[[ -p ~/kill_script.sh ]] && mkfifo ~/kill_script.sh
(read -N 0 < ~/kill_script && [[ $REPLY == "KILL" ]] && kill 0) &

while [ $SECONDS -lt $end ]
do
    ...

В stop.sh эхо что-нибудь ~/kill_script:

#! /bin/bash
echo anything at all

Это будет использовать mkfifo сделать именованную трубу. затем read попытается прочитать из этого канала и будет ждать, пока он вообще не получит какие-либо данные, затем продолжит работу. Это должно вступить в силу почти сразу.


использование screen

С screen Вы можете запустить оболочку через SSH, закрыть соединение, а затем возобновить его позже. Таким образом, вы можете начать screen сеанс для скрипта, закройте ваше соединение, выйдите в отпуск, вернитесь, отзовите ваше экранное соединение и убейте скрипт, используя Ctrl C.

Другие вопросы по тегам