Я нашел причину, наконец, сам.
Все это из-за:
net.ipv4.tcp _ tw _ recycle = 1
Из-за окон в пакете SYN всегда нет опции метки времени, но Linux всегда
параметр timestamp, поэтому почтовый сервер не создал новое соединение TCP/IP с запросом, имеющим неправильную временную метку.
-121--244790-
Следующая программа python должна делать то, что вы хотите, или что-то очень близкое к ней.
В required _ output.txt
3-я строка кажется ошибочной:
Mem _ id # -aa3: time- file1.txt value = ccx3/file2.txt value = dd3
dd3, вероятно, должен быть
cc3 '
Кроме того, что выходные данные программы совпадают, за исключением пробела, который кажется немного нерегулярным в выборке выходных данных.
Ввод считается упорядоченным по ключу (memid)
Ввод выборки немного ограничен ожидаемым поведением, когда первая и вторая строки имеют один и тот же мемид дважды (или более).
В выводе ()
я пытаюсь сопоставить
любые строки и все совпадающие строки (слева и справа). Поэтому порядок совпадения строк в пределах одного и того же мемида не важен. Если левое или правое или оба являются пустыми после печати легко (особенно когда оба пустые). В остальном я совпаду с каждой оставшейся строкой слева направо.
Вывод определяется fmt
последовательностей в line _ out ()
, можно свободно изменить/переупорядочить это.
#! /usr/bin/env python
# coding: utf-8
# http://unix.stackexchange.com/q/161913/33055
from __future__ import print_function
from collections import OrderedDict
from logging import debug
import sys
class RowBuffer:
def __init__(self, file_name, delim=None, max_diff=3):
"""delim is the character that is used for splitting input.
None->whitespace
"""
self._verbose = 0
self._file_name = file_name
self._fp = open(self._file_name)
self._delim = delim
self._max_diff = max_diff
self._head = self._fp.readline().split(delim)
# the buffer consists of a maximum of max_diff entries
# the keys are the first items of a row, the value a list
# of all other items on that row
self._buffer = OrderedDict()
self.fill_buffer()
def compare(self, rb):
"""check if self._buffer"""
if self._head != rb._head:
print('headings differ:\n {}\n {}'.format(
self._head, rb._head))
while self._buffer:
l = self.get()
try:
r = rb.get()
except KeyError:
debug('only left %s', l[0])
self.output(l, None, rb)
break
if l[0] == r[0]:
debug('compare vals %s', l[0])
self.output(l, r, rb)
continue
if l[0] in rb:
# left key in right, but not at top
# output right until top keys are same
while l[0] != r[0]:
debug('only right %s', r[0])
self.output(None, r, rb)
r = rb.get()
self.output(l, r, rb)
continue
if r[0] in self:
# right key in left, but not at top
# output left until top keys are same
while l[0] != r[0]:
debug('only left %s', l[0])
self.output(l, None, rb)
l = self.get()
self.output(l, r, rb)
continue
# neither found: output both
debug('neither left in right nor vv %s %s', l[0], r[0])
self.output(l, None, rb)
self.output(None, r, rb)
while rb._buffer: # remaining in right file
r = rb.get()
debug('only right %s', r[0])
self.output(None, r, rb)
def output(self, l, r, right):
fmt1 = '{col0_header}#-{col0_value} : {col_header}- ' \
'{left_file_name} value = {left_value} / ' \
'{right_file_name} value= {right_value}'
d = dict(
col0_header=self._head[0],
left_file_name=self._file_name,
right_file_name=right._file_name,
)
if l is not None and r is not None:
# one or more values on both sides, compare all lines on the
# left with all on the right remove any matching pairs
match = {} # left index to right index
for lidx, lv in enumerate(l[1]):
for ridx, rv in enumerate(r[1]):
if lv == rv:
if lidx not in match:
match[lidx] = ridx
# pop from back of list, not invalidate index
for lidx in sorted(match, reverse=True):
l[1].pop(lidx)
for ridx in sorted(match.values(), reverse=True):
r[1].pop(lidx)
if r is None or not r[1]:
for lv in l[1]:
for idx, k in enumerate(self._head[1:]):
self.line_out(d, col0_value=l[0], col_header=k,
left_value=lv[idx], right_value=' ')
return
if l is None or not l[1]:
for rv in r[1]:
for idx, k in enumerate(self._head[1:]):
self.line_out(d, col0_value=l[0], col_header=k,
left_value=' ', right_value=rv[idx])
return
# print non matching
for lv in l[1]:
for rv in r[1]:
for idx, k in enumerate(self._head[1:]):
if lv[idx] == rv[idx]:
continue # same value
self.line_out(d, col0_value=l[0], col_header=k,
left_value=lv[idx], right_value=rv[idx])
def line_out(self, d, **kw):
# manipulate and print output
# the fields of the format string can be arbitrarily arranged
# as long as the field names (between {} match)
fmt = '{col0_header}#-{col0_value} : {col_header}- ' \
'{left_file_name} value = {left_value} / ' \
'{right_file_name} value= {right_value}'
d1 = d.copy()
d1.update(kw)
s = fmt.format(**d1)
# s = s.rstrip()
s = s[0].upper() + s[1:] # sample output doesn't match input
print(s)
def get(self):
item = self._buffer.popitem(last=False)
self.fill_buffer()
return item
def fill_buffer(self):
if self._fp is None:
return
while len(self._buffer) < self._max_diff:
row = self._fp.readline().split(self._delim)
if not row:
self._fp.close()
self._fp = None
return
entry = self._buffer.setdefault(row[0], [])
entry.append(row[1:])
def __contains__(self, key):
self.fill_buffer()
return key in self._buffer
rb1 = RowBuffer(sys.argv[1])
rb2 = RowBuffer(sys.argv[2])
rb1.compare(rb2)
-121--102922-
Как уже упоминалось, это, вероятно, связано с настройкой страниц ядра. Я знаю нескольких людей с этой проблемой. Вы можете найти несколько документов об этом в Интернете, например
Я полностью исправил проблему при настройке, выполнив следующие действия. Обратите внимание YMMV, не все перечисленные ниже исправления могут быть необходимы, и, возможно, их будет недостаточно. Возможно, я забыл кое-что, чтобы быть честным. В любом случае, это моя установка и она работает.
echo madvise >/ sys/kernel/mm/transparent_hugepage/enabled
echo never >/ sys/kernel/mm/transparent_hugepage/defrag
5 * * * * curl http://www.google.com
не является командой оболочки, это запись в файле crontab . Файл crontab - это текстовый файл, содержащий описание заданий с указанием времени (здесь 5 * * * *
, что означает каждый час через 5 минут после часа), за которым следует команда для выполнения (здесь curl http://www.google.com
). Вам необходимо отредактировать файл crontab, чтобы добавить эту строку (в том учебном курсе, который вы читали , продолжайте читать до раздела «Конфигурация»). Вы делаете это с помощью команды crontab
. Выполните команду
crontab -e
. Это вызовет файл crontab в редакторе. Добавьте строку, затем сохраните и выйдите.
Обратите внимание, что в некоторых системах редактором по умолчанию является vi, который трудно использовать, если вы ничего о нем не знаете. Если вы не знаете vi, убедитесь, что редактор по умолчанию - тот, который вам удобен. Чтобы изменить редактор, установите переменную среды VISUAL
, например
export VISUAL=nano
В документе , который вы процитировали , вам нужно продолжать читать, пока не дойдете до раздела под названием Конфигурация . Это расскажет вам, как настроить crontab
.
Я думаю, он пытается сказать, что curl не может быть найден, поскольку его нет в PATH. Либо используйте абсолютный путь, либо задайте PATH в файле crontab.