Остановка под управлением сценария, хотя другой файл сценария

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

start.sh

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

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

2
задан 22 September 2014 в 03:40

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 для записи "УНИЧТОЖАЮТ" в тот файл:

#! /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, закрыть соединение и затем возобновить его позже. Таким образом, можно запустить a screen сессия для сценария, закройте свое соединение, уезжайте в отпуск, возвратитесь, вспомните свое экранное соединение и уничтожьте использование сценария CtrlC.

6
ответ дан 7 October 2019 в 01:56

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

Похожие вопросы: