Nano Hash - криптовалюты, майнинг, программирование

Как убить дочерний процесс после его зависания, чтобы он не блокировал родительский (BASH)

У меня есть следующий скрипт bash.

#!/bin/bash

stop_service {
  $(service $1 stop)
}

servicename=$(inictl list | grep $1 | cut -d ' ' -f1)
servicestate=$(initctl list | grep "$1" | cut -d ' ' -f2)
servicepid=$(initctl list | grep  "$1" | cut -d "," -f2 | cut -d " " -f3)
stop_service $servicename &

if [ \( $servicestate = "stop/killed," \) -o \( $servicestate = "start/killed," \) ] ;then
   /upstartCleaner/upstartCleaner $servicepid
   echo "Command executed"
else
  echo "The service didnt crash"
fi

Что я хочу сделать, так это запустить stop_service как дочерний процесс, а затем в родительском процессе иметь возможность определить, завис ли дочерний процесс и убить его, или иметь возможность отсоединить его выполнение от родительского процесса, чтобы он не зависал, когда он останавливается.

Каждый раз, когда я запускаю этот скрипт, а дочерний процесс перестает отвечать или зависает, это, в свою очередь, останавливает выполнение каждой строки родительского процесса после строки stop_service $servicename &.

13.04.2016

  • Кажется, вам нужна какая-то сторожевая функция. Пусть ваш дочерний процесс регистрируется в каком-либо файле или обновляет его состояние каждые несколько секунд, а из другого процесса просто проверяйте, не слишком ли устарело обновление. Если это так, перезапустите дочерний процесс. 13.04.2016
  • Как только вы применяете & после stop_service, он разветвляет дочерний элемент. Этот дочерний элемент создает моментальный снимок переменных в области действия скрипта, но обновление этих переменных не изменяет родительские переменные. Изменяет только моментальный снимок дочернего процесса. Загляните в SHM и «отправьте событие» родителю 13.04.2016

Ответы:


1

я полагаю, что простой способ лучше, просто выведите идентификатор дочернего процесса и добавьте его, чтобы убить, так что что-то вроде этого.

id=$process_id
kill $id
13.04.2016
  • Я мог бы отредактировать ваш ответ, похоже, этот фильтр слов предназначен только для пользователей с низким числом повторений. С другой стороны, вы уверены, что здесь нужны обратные кавычки? 13.04.2016
  • да, моя ошибка, это должен быть знак доллара, изменил это.... :) и так нормально работает... проверено! 13.04.2016
  • Проблема в том, что после сбоя дочернего процесса родительский процесс также останавливается, и я не могу его убить. 13.04.2016
  • хммм, я бы понял обратное, и это имело бы смысл, но это не имеет смысла, разве вы не можете использовать nohup (не вешать трубку) или что-то подобное, чтобы различать отношения между ними, и чтобы они не видели, что делает другой . чтобы это могло решить вашу проблему. 13.04.2016
  • @JoaoAlmeida, я просто просматривал некоторые из своих старых ответов, и я вспомнил об этом, я не знаю, наконец ли вы решили это, но просто для протокола, если вы этого не сделали, проверьте процессы зомби, потому что я думаю, что это то, что здесь происходит и может быть вам полезен. Использование kill -s SIGCHLD <ppid> скажет родителю убить его дочерний процесс, и через него родитель не выйдет из строя, потому что он выполняет это юридическое действие. ознакомьтесь с этой ссылкой, stackoverflow.com/edit-tag-wiki/17776 26.04.2016

  • 2

    Родительский процесс выполняет свой курс до последней строки в вашем скрипте. Однако ему приходится ждать любых порожденных им дочерних процессов, чтобы он мог освободить свое выполнение/процесс.

    В зависимости от вашего варианта использования, что вы могли бы сделать, это зациклиться на родительском элементе и посмотреть, завершится ли дочерний процесс.

    В вашем скрипте разветвите дочерний процесс с помощью &

    stop_service $servicename &
    

    Затем сразу после этого возьмите идентификатор процесса (PID) через $!

    proc_id=$!
    

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

    for i in `seq 1 5`; do
       if [ -d /proc/$proc_id ]; then
          # child is alive
          sleep 1s
       else
           break
       fi
    done
    if [ -d /proc/$proc_id ]; then
       # child did not complete within time
       kill $proc_id
       ps -ef | grep your_process_name | grep -v grep | awk '{print $2}' | xargs kill
    fi
    
    13.04.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..