Вы можете легко усечь файл, если сможете получить количество байтов до ваше смещение и ваши линии проходят от начальной точки до конца.
o=$(sed -ne'/regex/q;p'
Или, если ваш $ {TMPDIR: - / tmp}
находится в другой файловой системе, возможно:
{ cut -c2- | sed "$script" >file
}
Потому что (большинство) оболочки помещают свои здесь-документы в удаленный временный файл. Это совершенно безопасно, пока дескриптор поддерживается от начала до конца и
$ {TMPDIR: - / tmp}
имеет столько места, сколько вам нужно.
Оболочки, которые не используют временные файлы, используют каналы, поэтому их использование небезопасно.Эти оболочки обычно являются производными ash
, например busybox
, dash
, BSD sh
- zsh
, bash Однако
, ksh
и оболочка Bourne используют временные файлы.
по-видимому, я написал небольшую программу оболочки в июле прошлого года, чтобы сделать что-то очень похожее на это
Если / tmp
нежизнеспособен, то пока вы можете уместить файл в memory что-то вроде ...
sed 'H;$!d;x' file;}
... в общем случае по крайней мере гарантирует, что файл был полностью буферизован первым процессом sed
, прежде чем пытаться усечь входящий / исходящий файл.
Более целенаправленным и эффективным решением могло бы быть:
sed '/regex/!H;$!d;x' file;}
... потому что оно не беспокоило буферизацию строк, которые вы все равно собирались удалить.
Проверка общего случая:
{ nums=/tmp/nums
seq 1000000 >$nums
ls -lh "$nums"
wc -l "$nums"
sed 'H;$!d;x' <$nums | { read script && ### read always gets a blank
sed "$script" >$nums;}
wc -l "$nums"
ls -lh "$nums"
}
-rw-r--r-- 1 mikeserv mikeserv 6.6M Dec 22 20:26 /tmp/nums
1000000 /tmp/nums
1000000 /tmp/nums
-rw-r--r-- 1 mikeserv mikeserv 6.6M Dec 22 20:26 /tmp/nums
Из предоставленных вами выходных данных dmesg
видно, что проблема действительно связана с убийцей OOM.
Обычно происходит следующее: при запуске mysql система исчерпывает всю доступную память. Когда это происходит, ядро должно что-то убить, чтобы вернуть что-то. У него есть сложный алгоритм, который он использует, чтобы попытаться найти что-то, что можно убить, что не вызовет нестабильности системы. Алгоритм выбирает вашу оболочку. Затем, после того, как ваш снаряд убит, он обнаруживает, что этого недостаточно, и начинает убивать другие вещи. В конце концов он попадает в процесс mysql и убивает его.
Вывод dmesg
также показывает, что у вас всего около 500 МБ памяти в системе. Обычно я думаю, что этого достаточно для запуска mysql, если он маленький, и если вам наплевать на производительность. Но, очевидно, это говорит об обратном.
Есть ли еще что-нибудь, работающее на компьютере, использующее много памяти? Вывод dmesg
также должен был включать список процессов и количество потребляемой ими памяти.
Если больше ничего не использует ненормальный объем памяти, есть 2 варианта:
В Linux можно задать переменную PS1
для создания собственной подсказки.
Например:
$ export PS1="hello "
hello #your new prompt
Дополнительные сведения о настройке модных подсказок см. в разделе: http://www.maketecheasier.com/8-useful-and-interesting-bash-prompts
-121--290771-Таким образом, вы хотите написать пустую оболочку (интерпретатор команд). Минимальным решением будет цикл, который просто считывает строку, анализирует команду и ее аргументы и выполняет ее без каких-либо усовершенствований.
В python это можно сделать следующим образом:
import os
while True:
argv = raw_input("> ").split()
os.spawnv(os.P_WAIT, argv[0], argv)
Например, можно запустить
> /bin/ls -l /etc
Далее, вероятно, потребуется добавить поиск PATH
, чтобы можно было просто ввести ls
. После этого небо - предел.
Похоже на старые файлы базы данных из существующей установки mysql. При наличии данных необходимо сохранить команду mysql_upgrade. Если существующие данные не нужны, удалите/var/lib/mysql и повторно запустите сценарий mysql_secure_installation.