Используйте systemd для запуска скрипта, когда USB-накопитель отключен

В bash, когда fork()завершается ошибкой с EAGAIN, например, при достижении предела (с использованием setrlimit или с использованием этих ограничений pid cgroup ), bashзасыпает и пытается снова через 1 секунду, а затем через 2 секунды, если он снова не работает, а затем через 4, а затем он засыпает на 8 секунд и сдается, даже не попробовав еще один форк (! )).

Затем с помощью bash, как только предел будет достигнут (в течение доли секунды в тихой системе ), большинство этих процессов bash переходят в спящий режим. Вот почему форк-бомбы гораздо менее опасны в bash, чем в других снарядах.

Закрытие терминала не уничтожает эти процессы. Может быть, то, что вы видите, это форк-бомба, угасающая через чуть более 15 секунд (1+2+4+8 ), когда все процессы, которые успели запуститься и перешли в спящий режим, умирают в одно и то же время. через 8 секунд после их 4-й попытки разветвления.

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

Если вы хотите убить форк-бомбу, проще всего убить группу процессов в целом, использование killallне работает, так как killallнужно собрать список процессов, а затем отправить уничтожение отдельно для каждого обработать. Это нормально с bash, где все процессы спят, но не с другими оболочками, которые постоянно порождают процессы, поэтому процессы могут запускаться между каждым уничтожением.

Вы можете получить pgid с помощью ps -jи убить группу процессов с помощью kill -- "-$pgid".

0
28.01.2021, 17:04
1 ответ

Некоторую информацию можно найти в этом блоге

По сути, man-страница udev не рекомендует использовать RUN+= для более длинных процессов, а в ветке форума Archlinux они придумали решение для использования SYSTEMD _ХОЧЕТ, чтобы у вас был systemd unit для сценария, который вы хотите запустить, и вызовите его из правила udev.

Вам понадобится что-то вроде этого :Служба systemd, которая вызывает скрипт:

[Unit]
Description=Delete /mnt/usb folder on unmount
Requires=usb-drive.mount
After=usb-drive.mount

[Service]
ExecStart=/usr/bin/removeFolder.sh

[Install]
WantedBy=usb-drive.mount

Ваше правило udev:

ACTION=="remove", KERNEL=="7-1.1",SUBSYSTEM=="usb", ENV{SYSTEMD_WANTS}=="removefolder.service"

Как вы сказали, возможно, имеет смысл сделать это из первого сервиса systemd.

0
18.03.2021, 22:33

Теги

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