Остановка запущенного скрипта через другой файл скрипта
Я новичок в сценариях оболочки. Скажем, я запускаю такой скрипт. Это работает в течение 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.