В которой ситуации файл записан в блочное устройство во время umount?

Я просто искал то же самое, нашел этот вопрос здесь и также нашел решение в форме сценария Perl на GitHub.

сценарий

#!/opt/local/bin/perl
#
# Modified by @takaxp
# Last Update: 2012-01-09@22:13
# 2012-01-09: support date([YYYY-MM-DD XX]) insertion
# 2012-01-09: support #+BEGIN_SRC
# 2011-11-16: use strict and warnings
# 2011-11-16: Add conversion from numeric items to `  - '.
# 2011-11-16: Skip headers, if #+TITLE: is, use it as the top headline.
# 2011-11-17: Add DISQUS comment
# 2011-11-30: Add TODO/DONE color in items
# cat hoge.org | perl org2doku.pl > title.txt

# Usage
# 
#   cat <= 0) {
        if ($len == $$last_item_indents[$index]) {
            return $level;
        } else {
            for (my $i = $index; $i >= 0; $i--) {
                my $last_item_indent = $$last_item_indents[$i];
                if ($len > $last_item_indent) {
                    push @$last_item_indents, $len;
                    return $level + 1;
                } elsif ($len == $last_item_indent) {
                    return $level - ($index - $i);
                }
                pop @$last_item_indents;
            }
            return $level;
        }
    } else {
        push @$last_item_indents, $len;
        return $level + 1;
    }
}

sub doku_link {
    my $org_hlink = shift;
    while ($org_hlink =~ s/\[\[(.*?)\]\[(.*?)\]\]/[[$1|$2]]/g) {}
    return $org_hlink;
}

sub shallowest_indent {
    my $last_item_indents = shift;
    my $shallowest_indent = 128;
    foreach my $code_line (@$last_item_indents) {
        if ($code_line =~ /^(\s+).*/) {
            my $len = length($1);
            if ($len < $shallowest_indent) {
                $shallowest_indent = $len;
            }
        } else {
            $shallowest_indent = 0;
        }
    }
    return $shallowest_indent;
}

sub disqus_comment {
    my $title_of_document = shift;
    if($title_of_document){
    print "===== Comments =====\n";
    }else{
    print "====== Comments ======\n";
    }
    print "~~DISQUS~~\n";
}

# Replace TODO in items with colored TODO
sub replace_todo_color {
    my $line = shift;
    $$line =~
    s/TODO/TODO<\/span><\/html>/;
    $$line =~
    s/DONE/DONE<\/span><\/html>/;
}

my $is_code_block = 0;
my $is_published = 1;
my $is_table = 0;
my $current_block_type = "";
my $item_level = 0;
my $last_head_indent = 0;
my @code_block_buf = ();
my @last_item_indents = ();
my $title_of_document = "";
while (<>) {
    chomp;
    my $line = $_;

    # skip headers
    if($line =~ /^#\+([^\s]+):\s*(.+)/){
    if($1 eq "TITLE"){
        $title_of_document = $2;
        print "====== ".$title_of_document." ======\n";
    }
    next;
    }

    # Replace TAB at the head of lines
    $line =~ s/^\t/    <\/html>/;

    if($line =~ /^\[\d\d\d\d-\d\d-\d\d/){
    $line =
        "Date: ".$line."<\/span><\/html>\n";
    }

    # use github style
    $line =~ s/\=(.+?)\=/$1<\/span><\/html>/g;

  retry:
    if ($is_published) {
        if (/^=\ (.*)/) {
            # howm header
            $line = $1;
            $line =~ s/<<\n";
            my $shallowest_indent = &shallowest_indent(\@code_block_buf);
            foreach my $line (@code_block_buf) {
                my $regex = "\ " x $shallowest_indent;
                $line =~ s/^$regex//g;
                $line =~ s/^,\*/*/g;
                print $line."\n";
            }
            print "\n";
            @code_block_buf = ();
            next;

        } else {
            # paragraph
            if (!$is_code_block) {
                if ($line =~ /(.*?)\ \*([^\s]+)\*\ (.*)/) {
                    # bold
                    $line = $1." **".$2."** ".$3;
                }
                if ($line =~ /(.*?)\ _([^\s]+)_\ (.*)/) {
                    # under line
                    $line = $1." __".$2."__ ".$3;
                }

        # table
        if($line =~ /[^\|]*\|--/){
            $line = "";
            chomp($line);
        }elsif($line =~ /[^\|]*|/){
            $line =~ s/\|/\^/g;
        }else{
            $line = "?";
        }

            }
            $line =~ s/^\s+//g;
            if ($line) {
                $item_level = 0;
                @last_item_indents = ();
            }
        }

        if ($is_code_block) {
            push @code_block_buf, $_;
        } else {
            print &doku_link($line)."\n";
        }

    } else {
        if (/^(\*+)\ (.*)/) {
            my $head_indent = length($1);
            if (!($2 =~ /^!/)) {
                if ($head_indent <= $last_head_indent) {
                    $is_published = 1;
                    goto retry;
                }
            }
        }
    }
}

&disqus_comment($title_of_document);
1;

Я попытался преобразовать короткий документ Org, и он подходил.

3
24.05.2013, 21:14
2 ответа

Ядро сохраняет данные кэшируемыми в памяти, считывание данных очень важно (кто-то ожидает его), записи могут делаться лениво (никто не торопит Вас; данные просто могли бы использоваться снова/изменил снова). Поскольку устройства могут или читать или писать за один раз, это окупается для задержки записи как можно больше. Таким образом, данные записаны "добровольно" ядром, только если нет никакого выхода (нуждайтесь в пространстве теперь). Можно форсировать события вводными файлами синхронно (запись, как только что-либо изменяется), путем вызова fsync(2) на файле для вытеснения данных. При размонтировании устройства очевидно, все данные, кэшируемые для него, должны быть выписаны заранее.

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

2
27.01.2020, 21:13

Записи сделаны сразу же, если файл открыт синхронно, или файловая система, смонтированная с синхронизирующей опцией.

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

Можно попросить, чтобы ОС сбросила все эти кэши с sync команда

5
27.01.2020, 21:13

Теги

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