Как я могу запустить скрипт, когда интернет-соединение собирается потеряться?

Можно использовать команду find определить местоположение каждого файла, но поддержать структуру каталогов:

$ find /some/dir -type f -exec rm {} +

На эту названную Unix & Linux Q&A: гну находит и маскирование {} для некоторых оболочек - который?, выход {} с единственными галочками (') кажется, больше не необходим с современными дневными оболочками, такими как Bash.

4
27.09.2016, 01:17
2 ответа

Когда процесс завершается, все его потомки также умирают (если вы не используете NOHUP, в этом случае они возвращаются к init).

Это неправильно. Мертвая ошибка. Человек, сказавший, что либо ошибся, либо перепутал ту или иную ситуацию с общим случаем.

Существует два способа, с помощью которых смерть процесса может косвенно привести к смерти его детей. Они связаны с тем, что происходит при закрытии терминала. Когда терминал исчезает (исторически потому, что последовательная линия была прервана из-за зависания модема, в настоящее время обычно из-за того, что пользователь закрыл окно эмулятора терминала), сигнал SIGHUP посылается в процесс управления , выполняющийся в этом терминале - обычно начальная оболочка запускается в этом терминале. Оболочки обычно реагируют на это, выходя. Перед выходом оболочки, предназначенные для интерактивного использования, отправляют HUP в каждое запущенное задание.

Запуск задания из оболочки с nohup разрывает этот второй источник сигналов HUP, потому что задание будет игнорировать сигнал и, таким образом, не будет приказано умереть, когда терминал исчезнет. Другие способы прерывания распространения сигналов HUP из оболочки в задания включают использование disown builtin оболочки, если она имеет один (задание удаляется из списка заданий оболочки), и двойную вилку (оболочка запускает дочерний объект, который запускает собственный дочерний объект, и немедленно выходит из него; раковина не знает своего внука).

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

-121--10509-

Применяются обычные предостережения. Убедитесь, что резервное копирование данных выполнено. Я не несу ответственности за потерю данных. Это сработало для меня. Проверьте массив, прежде чем помещать в него значимые данные. Убедитесь, что он может пережить перезагрузку и изменения имени устройства и т.д.

Теперь перейдите к тому, что я сделал.

Сегодня я столкнулся с тем же вопросом. После поиска я смог исправить это и получить стабильное raid-устройство.

На двух дисках, которые я использовал для своего массива, я создал раздел с помощью gdisk перед созданием устройства RAID. Я удалил разделы, используя gdisk, но когда я создал массив, я получил информационное сообщение ниже:

mdadm: partition table exists on /dev/disk/by-id/ata-ST4000VN000-1H4168_Z30254QX but will be lost or meaningless after creating array

Каждый раз, когда я видел это сообщение, когда я перезагрузил массив будет потерян.

Я решил использовать вышеприведенное предложение Джима К и создать раздел Linux raid на каждом диске. Это сработало, но скорость синхронизации перешла от 145MB/s на необработанных дисках к 35MB/s на секционированных. Я, вероятно, мог бы играть с параметрами настройки, но почему я должен это делать?

Я пошел на поиски, чтобы выяснить, как уничтожить таблицу разделов диска.

Исправление...

Сначала убедитесь, что устройство RAID остановлено, а затем удалите сигнатуру RAID дисков.

mdadm --stop /dev/md<number> 
mdadm --zero-superblock /dev/sd<x> (do this for all your raid disks)

Запустите blkid и проверьте наличие любого из устройств raid. Если они это сделают.

run:

dd if=/dev/zero of=/dev/sd<x> bs=512 count=1

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

В моем случае gpt имел метку LVM, резервную копию на одном диске. Я вычистил это, используя lvremove, vgremove, и, наконец, pvremove.

blkid на этот раз был чистым.

Однако, когда я попытался создать массив снова, я получил ошибку о существующем raid-устройстве, поэтому я сделал dd еще раз. После этого массив создавался без уведомлений, как я перечислил выше.

Я воссоздал массив в том виде, в котором он был изначально, я использовал диск/побочный идентификатор вместо sd. Как только массив был воссоздан, тестовый раздел, который я создал на массиве, вернулся нетронутым.

Теперь массив будет перезагружен и изменен на/dev/sd с момента создания массива.

-121--133922-

Вы можете написать собственный сценарий оболочки, который регистрирует именно то, что вы хотите, внутри цикла времени (1) с вызовом сна в конце (или любой продолжительности сна, который вы хотите). Примерно так:

function get_logname
  {
  echo `date +'%F-%H-%M-%S'`.log
  }

function am_online
  {
   ping -c 1 google.com  >/dev/null 2>&1
   echo $?
  }

function update_logfile
  {
  echo "YOUR DATA TO BE LOGGED" >> $1 
  }

  CUR_LOG=`get_logname`
  echo $CUR_LOG
  while [ 1 ]; do
        if [ "`am_online`" -eq 0 ]; then
           update_logfile $CUR_LOG
        else
           echo "we are offline!"
       CUR_LOG=`get_logname`
        fi

        sleep 1
  done

Пока вы находитесь в сети, он регистрируется в вашем файле журнала (> > для добавления новых данных > для перезаписи файла, чтобы он содержал только новые данные) каждую секунду. Когда вы находитесь в автономном режиме, он постоянно выбирает новое имя для следующего файла журнала и ничего не записывает в журнал. Когда вы возвращаетесь в Интернет, он начинает входить в новый файл журнала с последним выбранным именем, оставляя другие файлы журнала нетронутыми.

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

Сохраните файл в виде «my_internet_logging_script.sh» и выполните команду

sh my_internet_logging_script.sh

в каталоге, в котором должны отображаться файлы журнала (или отредактируйте сценарий соответствующим образом).

2
27.01.2020, 20:58

Ответьте на последний вопрос: ifconfig читает /proc/net/dev и /proc/net/if_inet6. Информация о передаваемых данных для различных интерфейсов содержится в первом из этих файлов.

/proc - это специальная файловая система, файлы которой не хранятся на жестком диске, а создаются ядром каждый раз, когда вы хотите их прочитать, поэтому доступ к файлам осуществляется довольно быстро. Более того, непосредственный разбор /proc/net/dev должен быть немного быстрее, чем разбор ifconfig, так как эта команда делает разные вещи, которые вам не нужны.

Просто чтобы дать вам грубое представление, вот время для 1000 повторных ifconfig или cat /proc/net/dev (повтор - команда zsh):

$ time (repeat 1000 ifconfig > /dev/null)
1.14s user 3.85s system 90% cpu 5.513 total
$ time (repeat 1000 cat /proc/net/dev > /dev/null)
0.57s user 2.44s system 70% cpu 4.282 tota

Конечно, парсинг /proc/net/dev все еще не является хорошим решением, но, по крайней мере, вы можете получить 20-30% по скорости, если все-таки вы решите анализировать вывод каждую секунду.

1
27.01.2020, 20:58

Теги

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