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
операция над любым из этих дубликатов файловых дескрипторов или когда все такие файловые дескрипторы были закрыты.