Я не знаю другого способа заблокировать порт от использования, кроме как проактивно использовать его самостоятельно.Общая идея, которую я бы выдвинул, заключалась в том, чтобы изменить вашу пакетную обработку на:
отключить сценарий «хранителя порта»
запустить обычную пакетную обработку
запустить новый сценарий «хранителя порта»
Этот обходной путь поможет предотвратить привязку мошеннического процесса к нужному порту (процесс может захватить порт между шагами 1 и 2 или между шагами 2 и 3), но не будет предотвращает сбой в пакетном процессе, когда этот пакетный процесс кажется завершенным, но не освобождает порт (завершая все его процессы).
Пример сценария "сохранения порта" на perl:
#!/usr/bin/env perl
# listens on the given port
use strict;
use IO::Socket;
my $port = shift or die "Usage: $0 <port>";
my $socket = new IO::Socket::INET(
LocalHost => '0.0.0.0',
LocalPort => $port,
Proto => 'tcp',
Listen => 1,
Reuse => 1,
)
or die "Cannot create socket: $!\n";
while (1) {
my $c = $socket->accept();
shutdown($c, 2);
}
Вам нужно будет либо сохранить PID сценария, либо найти и уничтожить его, поскольку он запускает бесконечный цикл, удерживая данный порт открытым.
Я просто забыл mount boot (спасибо, jasonwryan ).
Решение этой проблемы в моем случае было:
Обновление:
пакман -Сью
Регенерация initramfs с помощью:
mkinitcpio -p linux
Если вы используете grub:
grub -mkconfig -или /mnt/boot/grub/grub.cfg
Перезапустить.
Вот что у меня сработало (antergos, двойная загрузка с Windows 10 ). Это небольшая модификация приведенного выше ответа.
Обновление:
пакман -Сью
Регенерация initramfs с помощью:
mkinitcpio -p linux
Если вы используете grub:
grub -mkconfig -или /boot/grub/grub.cfg
Перезапустить.