pkill не полностью убивает процесс?

Я делаю некоторые тесты с flock а также pkill для test.sh сценарий, с которого я звоню cron и я столкнулся с чем-то, чего я не понимаю.

test.sh запланировано как * * * * * работа в хрон. Это очень простой скрипт, который в целях тестирования записывает метку времени в файл и затем спит в течение 5 минут. Это для подтверждения flock работает хорошо и предотвращает несколько процессов для одного и того же сценария.

Эта часть работает хорошо, так как я вижу только одну временную метку, появляющуюся за 5 минут, несмотря на test.sh планируется запускать каждую минуту.

Теперь в качестве дополнительной меры безопасности я хочу убить test.sh (потому что сценарий, который я на самом деле хочу использовать, иногда зависает, синхронизируя некоторые файлы с S3 с помощью AWS CLI)

Итак, я понял, pkill было бы самым простым, так как это не требует изменения чего-либо в моем существующем скрипте.

Если я бегу pkill -9 -f test.sh он говорит, что процессы убиты. Бег ps aux | grep test.sh Я действительно не вижу никаких test.sh процессы больше.

Однако как cron должен test.sh Я ожидаю, что каждую минуту после завершения процесса он будет возобновляться через менее чем минуту.

Однако, похоже, что скрипт фактически не перезапускается, пока не закончится период ожидания.

Таким образом, сценарий изначально выполняется на 12:00, сон продлится до 12:05, Если я убью сценарий на 12:02 Я ожидаю, что это снова 12:03 но это на самом деле не работает снова, пока 12:05 что соответствует периоду сна.

Почему это происходит? Кроме того, если pkill не рекомендуется, есть ли другой способ убить мои процессы через определенное время? Желательно без необходимости редактировать оригинальный скрипт.

1 ответ

Смотрите следующий пример:

 1  exec 9> /tmp/flock.tmp
 2  if ! flock -n 9; then
 3      echo "locked by others!"
 4      exit 1
 5  fi
 6
 7  sleep 300

Строка 1 открывает FD 9 в файле блокировки. Линия 2 flock устанавливает блокировку на FD. Линия 7 sleep наследует FD и держит его заблокированным. Когда ты pkill .sh сценарий это не убьет sleep поэтому FD все еще заблокирован до sleep отделки. Итак, чтобы очистить, нужно убить все запущенные процессы после flock,


flock(1) использования flock(2) и в соответствии с flock(2):

Замки, созданные flock() связаны с описанием открытого файла (см. open(2)). Это означает, что дубликаты файловых дескрипторов (созданные, например, fork(2) или же dup(2)) относятся к той же блокировке, и эта блокировка может быть изменена или снята с использованием любого из этих файловых дескрипторов. Кроме того, блокировка снимается либо явным LOCK_UN операция над любым из этих дубликатов файловых дескрипторов или когда все такие файловые дескрипторы были закрыты.

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