Is it possible to boot in a way that doesn't delete /tmp?
Say I’m running some lengthy process, consisting of two steps: a generates a big intermediate file, say /tmp/aoutput , then b reads that file and does something further with it.
Now the system crashed during the b step. Is it possible to reboot the system in a way that will not delete the contents of /tmp , as would usually happen on boot, so that we can immediately restart b without first running a completely?
This assumes of course that /tmp is not mounted in tmpfs .
I’d like to preclude solutions that involve physically taking out the HDD/SSD or booting with a live USB medium. In my concrete situation now, it’s actually an SSD with full disk encryption, but I’d also be interested in solutions that only work with a non-encrypted drive.
edit Still keeping the question open for now, because neither of the answers gives a solution that works without either a live medium or tweaking the configuration beforehand. Maybe it’s really not possible any other way, but it seems odd: doesn’t GRUB already mount partitions, in order to boot Linux? If so, isn’t there a way to manually move the files, before ever launching systemd ? Perhaps I’m wrong, I know little about bootloaders; but then I’d like to hear the reason why this is impossible.
systemd configuration info:
4 Answers 4
TL;DR: Use a live medium if the crash just happened. Otherwise configure your system by copying /usr/lib/tmpfiles.d/tmp.conf to /etc/tmpfiles.d/tmp.conf and change the file in etc :
If your files don’t follow a specific pattern, then use the following settings instead:
Now the system crashed during the b step. Is it possible to reboot the system in a way that will not delete the contents of /tmp, as would usually happen on boot, so that we can immediately restart b without first running a completely?
Well, somewhat, if you can configure the system before the crash happens. If the system is already crashed at this very moment, then you must use a live medium, as every usual systemd.target ( rescue , multi-user , graphical ) includes the deletion of temporary files, even the rescue.target .
That being said, to be ready for the next crash, we can change your tmpfiles behavior. Most Debian-derived systems define the behaviour for /tmp in /usr/lib/tmpfiles.d/tmp.conf :
The line responsible for the cleanup is
As per tmpfiles.d(5) , a capital D indicates that the directory should get removed on systemd-tmpfiles —remove . Unfortunately that command runs on almost every target due to systemd-tmpfiles-setup.service :
Also, there are several timers that trigger a —clean operation and thus also remove old files.
Depending on your scenario, you have several solutions at hand, none of which are perfect.
Warning: Regardless of what you do, do not change /usr/lib/tmpfiles.d/ ‘s content. Instead, create a file with the same name in /etc/tmpfiles.d , e.g.
tmpfiles.d follows the usual systemd rules: /etc > /run > /usr/lib , i.e. /etc/ gets priority.
Option 1: Change the service permanently
/tmp gets removed due to —remove in the aforementioned service. You can systemctl edit the ExecStart argument to remove the —remove parameter:
The additional empty ExecStart is necessary to remove the original configuration. Alternatively run systemctl edit —full . and edit the resulting file.
As —remove is missing, D in all your configuration files is effectively disabled, which might not be helpful and thus discouraged by me. So instead you probably want to change the definition of your /tmp rule:
Option 2: Clean /tmp only for files of specific age
Copy /usr/lib/tmpfiles.d/tmp.conf to /etc/tmpfiles.d/tmp.conf and replace the D line
This will only delete files that are older than 12 hours instead of all files. If you reboot immediately after a crash, then this might be enough for you. However, we can even go a step further.
Option 3: Exclude project files
If your files always have the same name/pattern, we can prevent them from being deleted with an e x clusion:
Note that 1s will effectively remove all files when systemd-tmpfiles is called, except /tmp/*output files, e.g. /tmp/aoutput . You can also exclude whole folders.
The last variant should be sufficient for your problem and prevent you from getting a /tmp/ that’s too large.
Checking the configuration
After you’ve changed the configuration, it’s time to test it. This test is the same, regardless which variant you’ve used. Create files that have similar names in your /tmp and then run the systemd services:
If everything is set up correctly, your "project" files should still be there. If you’ve used the e x clusion variant, then the other garbage in /tmp/ should be gone.
php:: how long to tmp files stay?
If a user uploads a file and it already exists I want to warn the user (this is all through ajax) and give them the option to replace it, or cancel.
Instead of moving the file, I was curious if I could just leave the file in tmp and pass back the path to that file in the ajax response.
If they user says overwrite the old file in that ajax request pass the path back to php which continues to work on the file.
For this to work however I need to know how long a file stays in php’s tmp dir
3 Answers 3
Files uploaded through POST are deleted right after php script finishes its execution.
According to php.net: «The file will be deleted from the temporary directory at the end of the request if it has not been moved away or renamed.»
The file will be deleted from the temporary directory at the end of the request if it has not been moved away or renamed.
Files that are to be kept should therefore be moved to another location.
More generally, as your question title might imply, temporary folders are left to be cleaned up by the system. This is true when using functions like tempnam or tmpfile, or simply when writing to the temporary directory (see sys_get_temp_dir).
In Ubuntu, this is done at every system reboot, or at a time interval, as defined in /etc/default/rcS .
In some Red Hat based distros, it is done using the tmpwatch utility from a cronjob. In others, the /tmp partition is mounted using the tmpfs filesystem, which is similar to a RAM disk (therefore being cleaned when the computer shuts down).
Another known mechanism is a size threshold, which means that the temporary directory will be cleaned up from the older files when it reaches a certain size.
Set tmp d garbage что она делает
После загрузки операционная система готова к работе. Под ее управлением можно запускать различные программы системного и прикладного назначения. Большинство пользователей работают с операционной системой не напрямую, а с помощью файловых (типа Norton Commander, Volcov Commander, Far, Dos Navigator и т.п.) или операционных оболочек (типа Windows 3.11, Dos Shell и других.) Но, во-первых, некоторые программы по разным причинам не выполняются при загруженных оболочках. Во-вторых, вследствие большого количества операционных оболочек трудно ориентироваться в них. В-третьих не всегда оболочку можно запустить (например, при временном выходе в операционную систему из выполняемой ей-же программы.) При временном выходе в DOS поверх программы загружается файл Command.com, и оперативной памяти становится недостаточно для работы операционной оболочки. В-четвертых, при сбоях в операционной системе Microsoft Windows95/98 иногда доступна загрузка только в командной строке.
Указанное выше позволяет сделать вывод о необходимости умения пользоваться командной строкой операционной системы. В этой части дается как бы "мультилингва" — описания служебных программ для работы с файлами в операционных системах Microsoft (MS-DOS, MS Windows 95/98/NT), в операционной системе IBM OS/2 и LINUX.
Для более подробной информации смотри документацию к операционным системам.
C.2.2. Shell и переменные окружения
После загрузки ядра операционной системы (для DOS это файлы Io.sys и MSDOS.sys) загружается так называемая программная оболочка, (или командный файл Command.com для систем MSDOS). В этой программной оболочке (или Shell) находятся интерпретаторы команд операционной системы и переменные окружения. Эти переменные окружения определяют приглашение операционной системы, пути, по котором ищутся вспомогательные файлы и программы, настройки аппаратных средств и опции вывода оглавления каталога.
Для операционной системы MS-DOS существует две оболочки. Первая, выбираемая по умолчанию и входящая в состав дистрибутива этой системы является программа Command.com. Другой оболочкой является входящий в состав Norton Utilites for DOS v. 6.0 — 8.0 оболочка NDOS.com.
Для UNIX — подобных операционных систем используется несколько различных оболочек. В частности, для LINUX наиболее часто используемые оболочки — это Bourne Again Shell (BASH) и TCSH — shell.
Все эти оболочки имеют разные переменные окружения. Описанием этих переменных автор и начнет свой рассказ о командной строке операционных систем.
Также следует отметить, что в [Р. Петерсен. LINUX: руководство по операционной системе //Изд. группа BHV, Киев, 1997. — 688 с.] на странице 446 дается следующая классификация переменных окружения, которой автор и будет придерживаться.
1. Системные переменные — специальные переменные, которые нельзя переопределять.
2. Переопределяемые переменные — специальные переменные, которые можно переопределять.
3. Пользовательские переменные — переменные, присутствие которых в окружении не обязательно.
C.2.2.1. Переменные окружения Command.com
Итак, перечислим основные переменные окружения MS-DOS:
1. Переменная местонахождения командного процессора COMSPEC.
2. Переменная приглашения командной строки PROMPT.
3. Переменная приглашения командной строки Windows 3.1x (только в MS-DOS v. 6.0 — 6.22) WINPMT.
4. Переменная опций вывода оглавления каталога, действующих по-умолчанию DIRCMD.
5. Переменная путей текущей конфигурации DOS (только для MS-DOS v. 6.0 и старше) CONFIG.
6. Переменная путей для поиска исполняемых файлов PATH.
7. Переменные для каталогов со временными файлами TEMP и TMP.
8. Специальные переменные окружения, требуемые прикладными пакетами.
Примечание: системные переменные графической оболочки Windows здесь не рассматриваются.
В таблице приведены значения по умолчанию для этих переменных окружения.
Таблица C.I. Значения основных переменных MS-DOS по-умолчанию.
Рассмотрим эти переменные по-подробнее:
Системные переменные DOS.
1. Переменная CONFIG определяет, какая из указанных в файлах Config.sys и Autoexec.bat конфигураций в настройке операционной системы активна. Эта опция не несет особого смысла и используется в файле Autoexec.bat в строке goto %config%. В этой строке определяется переход к той или иной последовательности загрузки резидентных программ для заданной конфигурации файла Config.sys. Для пользователя же эта переменная носит чисто информационный характер.
2. Переменная COMSPEC . Указывает путь местонахождения командного файла (или оболочки DOS). Этот путь соответствует пути для командного файла, указанного директивой SHELL в файле Config.sys. Автор считает, что существует только одна причина явно менять эту переменную — в случае перемещения командного файла.
Пример; с дискеты загружается операционная система фирмы Microsoft. С целью обеспечения правильной работы системы при смене дискеты в памяти компьютера создается виртуальный диск размером 2 Мбайта следующей командой файла Config.sys:
DEVICE=RAMDRIVE,SYS 2048 512 128 /E
В файл же Auoexec.bat вставляются следующие строчки:
После этого обращение к командному файлу всегда будет происходить на виртуальный диск D. В дисковод можно вставлять любые дискеты — система на "зависнет".
3. Переменная TZ — устанавливает часовой пояс для рабочей станции, работающей в глобальной сети. Ее синтаксис:
set TZ=zzzhhdst , где
zzz — зона местного времени, hh — отставание от Гринвича, dst — зона "летнего" времени. Так, для Москвы:
Вообще EST определяет отставание от Гринвича (восточная долгота), PST — опережениеГринвича (западная долгота), а EDT/PDT — учет перехода на летнее время.
Остальные переменные рассматриваются в соответствующих разделах, посвященных различным аспектам работы командной оболочки DOS.
C.2.2.1.1. Задание переменных окружения. Команда SET
В основном все переменные окружения оболочки MS-DOS определяются с помощью команды SET в файле Autoexec.bat. Исключением являются следующие переменные:
— CONFIG — определяется в файле Config.sys,
— PROMPT — определяется отдельной командой DOS — оболочки,
— PATH — задается отдельно в файле Autoexec.bat.
Команда SET без параметров выдает текущее состояние переменных окружения.
присваивает переменной с идентификатором <имя> строку <значение>. В строке <значение> делается различие между прописными и строчными буквами, а в имени переменной такого различия нет.
отменяет все значения переменной с идентификатором <имя> и удаляет ее из системного окружения.
присваивает значение переменной TMP, которые старые прикладные программы фирмы Microsoft использовали для определения каталога со временными файлами.
та же команда, набранная строчными буквами.
переменной FILE присваивается имя файла scandisk.log. Теперь эту переменную можно использовать вместо имени этого файла, например:
type %FILE% | more — выдает поэкранную распечатку файла scandisk.log
Замечание 1. Автор не советует использовать в команде set никаких лишних пробелов, Так, из за указания пробелов перед и после знака "=" в операционной системе MS-DOS v. 6.0 в команде set TMP = C:\TMP переменная TMP у автора не добавилась в окружение DOS. Указание же пробелов после знака "=" при определении переменной PATH в любой операционной системе всегда приводит к очистке этой переменной.
Замечание 2. Задание и сброс переменных окружения возможно только в файле Autoexec.bat и в "чистой" командной строке MS-DOS. Задание же переменных окружения в файловых оболочках не приведет к изменению значений переменных окружения. В операционных же оболочках (и в графических оболочках MS WINDOWS 95/98/NT) изменение переменных окружения произойдет только на текущий сеанс эмуляции MS-DOS).
C.2.2.1.2. Переменная PATH
Переменная PATH определяет пути, по которым будет производится поиск исполняемых файлов, набранных в командной строке или запускаемой из графической оболочки. Это бывает необходимо в следующих случаях:
1. Необходим запуск программы не из ее "родного" каталога, а из каталога, содержащего файлы пользователя, обрабатываемые этой программой. Это наиболее часто используемый случай.
2. Программа использует при своей работе другие программы, расположенные не в ее "родном" каталоге. Эта ситуация часто происходит при работе программ Windows.
Для удобства работы переменная PATH записывается без префикса SET. Ее синтаксис:
Путь можно писать как прописными, так и строчными буквами, без разницы: операционная система все символы приведет к верхнему регистру. Это добавление очень важное! Дело в том, что добавление новых путей к переменной PATH должно производится с указанием путей в верхнем регистре.
Задание PATH или PATH= без путей очищает переменную PATH. Задание же
PATH=<новый_список_путей> приводит к замене существующего значения переменной новым значением, а не добавление нового значения к списку имеющихся.
Добавление новых значений путей к файлам в переменную PATH происходит с помощью команды SET с указанием путей в верхнем регистре. Пример:
добавляет новый путь в переменную PATH в ее конец.
добавляет новый путь в переменную PATH в ее начало.
Неправильное использование переменной PATH:
Замечание 1. При запуски файла на исполнение сначала проверяется наличие файла с этим именем в рабочем каталоге, а уже потом — в путях переменной PATH.
Замечание 2. Порядок поиска файла по путям переменной PATH происходит слева направо, в порядке их записи. Поэтому, если существуют несколько исполняемых файлов с одинаковыми именами, но расположенных в разных каталогах, и эти каталоги прописаны в переменной PATH, то при вызове программы на исполнение из произвольного "неродного" каталога запустится программа из каталога, расположенного первым в переменной PATH.
Замечание 3. Переменная PATH задает пути поиска только исполняемых файлов. Для задания пути поиска неисполняемых файлов (например, файлов данных) используется команда Append.
C.2.2.1.3. Другие переменные окружения Command.com
Наиболее часто используются следующие переменные окружения DOS:
TEXT — определяет каталог со служебными файлами Лексикона. Если она не указана, используется каталог с программой lexicon.
CHIFILES — определяет каталог со служебными файлами ChiWriter. Если она не указана, используется каталог с программой cw.
87 — указывает программам, написанных на TurboC и Turbo Pascal, использовать (set 87=Y) или не использовать (set 87=N) команды сопроцессоров i80x87. Если переменная не используется, то инструкции используются только при наличии в системе сопроцессора.
PKTMP — указывает имя каталога, в котором архиватор PKZIP создает свои временные файлы.
INCLUDE — указывает имена каталогов (разделенных ";"), в которых происходит поиск файлов заголовка компилятором Microsoft.
LIB — указывает имена каталогов (разделенных ";"), в которых происходит поиск библиотек и объектных файлов при их сборке в исполняемый файл командой link ("редактор связей").
NC — указывает имена каталогов со служебными файлами Norton Commander. По-умолчанию — каталог с файлом nc,com (nc.exe в более поздних версий).
VC — указывает имена каталогов со служебными файлами Volkov Commander. По умолчанию — каталог с файлом vc.com.
NU — указывает имена каталогов со служебными файлами Norton Utilites. По умолчанию — каталог с файлом norton.exe.
LEX — используется программой для проверки орфографии Micro Spell. Она должна быть обязательно установлена при пользовании этой программой. В противном случае программа выдает ошибку.
ME_PATH — переменная используется для указания каталога с файлами редактора MultiEdit. Ее использование не обязательно — система сама правильно распознает местонахождение этих файлов.
BLASTER — указывает параметры звуковой платы. Пример:
set BLASTER=a330 i9 d1 t2
базовый порт ввода/вывода — 330, ей присвоено аппаратное прерывание IRQ9, она использует канал DMA — 1, тип карты — 2 (совместимая с Sound Blaster Pro). Обычно эта переменная устанавливается в файл Autoexec.bat командой инсталляции драйверов звуковой платы.
TEMP и TMP — переменные, определяющие каталог, в котором программы фирмы Microsoft создают свои временные файлы. Переменная TMP используется старыми приложениями, TEMP — новыми.
C.2.3. Переменные BASH
В отличие от DOS и его оболочек количество переменных окружения в LINUX значительно больше. Это объясняется тем, что UNIX — подобные системы были специально разработаны для работы со строкой приглашения операционной системы. С помощью этого приглашения и встроенных в UNIX стандартных команд в ней можно писать настоящие программы, содержащими даже условные выражения и циклы!
Различные разработчики UNIX — подобных операционных систем создали не только разные ядра и прикладные программы для этих операционных систем, но и разные оболочки. LINUX впитала лучшее из этих разработок, и в настоящее время поддерживает следующие оболочки: Bourne Again Shell (BASH), Public Domain Korn Shell (PDKSH) и TC — Shell (TCSH). Они в свою очередь являются потомками Korn — Shell и C = Shell. Не смотря на различия в реализации этих командных оболочек в UNIX — подобных операционных системах, в LINUX между ними больше сходства, чем различий. Это понятно — они реализованы в рамках одной операционной системы для Intel — совместимых компьютеров. К рассмотрению переменных в этих оболочках мы и приступим.
По умолчанию в LINUX применяется BASH. Но по желанию пользователь может загрузить другую оболочку. Все они вызываются "одна поверх другой", расходуя память компьютера. В отличие от Command.com и NDOS.com, каждая новая оболочка загружается с параметрами по-умолчанию, а текущие установки сбрасываются. Так же, как и в DOS, при возврате в предыдущую оболочку все переопределенные переменные очищаются. Для "наследования" переменных (то есть сохранения настроек части переменных предыдущих оболочек в последующих) в LINUX используются команды export в BASH и setenv в TCSH, о которых будет сказано ниже.
C.2.3.1. Определение переменной
Синтаксис определения переменной в BASH следующий:
В качестве константы используется так называемая символьная константа — набор ASCII — символов, заключенных в двойные кавычки (как в языке Си, на котором написана данная операционная система). Регистр букв, набранных как в имени переменной, так и в константе, существен. Так, в отличие от DOS, переменные me, ME и Me различны! Пример определения переменной:
В этом примере переменной myfile присваивается строка List. Теперь переменную myfile можно использовать вместо строки List. В качестве примера приводим следующие фрагменты команд, набранных в командном приглашении.
В этом примере вначале создается оглавление каталога (команда ls, см. . ), которое перенаправляется в файл List. После этого на экран выводится сообщение:
и на принтервыдается содержание файла List (т.е оглавления текущего каталога, см. первую команду). Заметим, что перед использованием переменной перед ней ставится знак доллара, указывающий, что вместо символов (в данном случае myfile) используется строковая переменная.
C.2.3.2. Переназначение переменной и отмена его значения. Вывод текущих значений переменных.
Для назначения переменной нового значения используется та же конструкция:
где новое значение — константа.
Для отмены назначения переменной и удаления этой переменной из окружения используется команда unset. Например,
удаляет из окружения переменную myfile.
Вывод текущих значений переменных выдается с помощью команды set, а только специальных переменных окружения — командой env.
C.2.3.3. Экспорт переменных
Экспорт переменной в другую оболочку осуществляется в BASH с помощью команды export. Ее синтаксис:
т.е. представляет из себя команду и список экспортируемых переменных, разделенную пробелами. Переменные перед этим должны быть определены.
C.2.3.4. Системные переменные BASH
Переменная HOME.
Переменная HOME определяет путевое имя Вашего начального каталога. Этот каталог автоматически создается при создании администратором Ваших учетных данных, а этой переменной назначается правильное значение этого каталога. Эта переменная используется в том случае, когда нужно задать путевое имя начального каталога. Например, пусть переменной HOME присвоено значение /home/yuri. Тогда следующая команда:
приведет к переходу в каталог /homr/yuri/letters.
Переменная LOGNAME .
Данная переменная содержит Ваше регистрационное имя. Так, для пользователя yuri значение этой переменной будет yuri. Ее следует использовать в тех случаях, когда надо указать регистрационное имя.
Переменная TZ
Эта переменная определяет часовой пояс, используемый в системе.
Задание зоны аналогично для переменной TZ в DOS.
C.2.3.5. Переопределяемые переменные
Переменная SHELL
В операционной системе LINUX при регистрации можно использовать три оболочки (см. введение к разделу "Переменные BASH". Переменная SHELL определяет оболочку, загружаемую по умолчанию. В качестве строки передается каталог с файлами оболочки. Пример:
задает в качестве оболочки, загружаемой по-умолчанию, BASH.
задает в качестве оболочки, загружаемой по-умолчанию, PDKSH-shell.
задает в качестве оболочки, загружаемой по-умолчанию, TCSH.
Заметим, что смена оболочки произойдет не сразу, а только после перезагрузки системы.
Переменная PATH
Данная переменная содержит имена каталогов, в котором содержатся выполняемые программы. При записи программы на исполнение в каталогах, заданных этой переменной, ищутся файлы с данным именем, а после нахождения этого имени оно "достраивается" до полного имени и только после этого запускается на выполнение. В отличие от DOS, если текущий каталог не указан в переменной PATH, из него также нельзя запускать файлы.
В переменной PATH все каталоги записываются без пробелов, а разделяются знаком ":" (двоеточие). Знак двоеточие в конце означает текущий каталог. В переменную PATH обязательно необходимо включать имена каталогов /usr/bin и /usr/sbin. По-умолчанию переменная PATH выглядит так:
то есть в ней указаны вышеперечисленные каталоги и рабочий каталог.
Добавление в переменную PATH новых каталогов происходит, как показано в следующем примере:
В данном примере в конец списка каталогов PATH добавляется домашний каталог.
Переменные PS1 и PS2
Данные переменные определяют вид приглашения операционной системы: основной и дополнительный.
Переменные MAIL и MAILCHECK
В операционную систему LINUX встроена возможность использования электронной почты, которая для других операционных систем реализована с помощью дополнительных программных пакетов. Однако для того, чтобы электронная почта могла функционировать, системе должно быть указано местоположение почтового ящика, В этот почтовый ящик, который есть у каждого пользователя LINUX, система помещает поступившие на его имя сообщения. Обычно почтовый ящик создается при создании учетных данных пользователя, и система автоматически прописывает это имя в своих файлах конфигурации.
Однако это местоположение можно поменять. Для этого существует переменная MAIL. В переменной MAIL указывается путь для основного почтового ящика. Поскольку у каждого пользователя должен быть хотя бы один почтовый ящик, эта переменная должна присутствовать обязательно.
Переменная MAILCHECK задает промежуток времени, по истечении которого система будет предупреждать Вас о получении почты. По-умолчанию этот промежуток устанавливается в 600 секунд (10 минут). Время указывается в секундах.
Пример использования переменных для управления электронной почтой:
В данном примере основной почтовый ящик переназначается в каталог /var/mail/yuri, уведомление о поступившей почте будет посылаться каждые 1200 секунд (20 минут).
C.2.3.6. Переменные режима
В BASH существуют так называемые дополнительные режимы работы оболочки. Это внутренние переменные, значения которых можно устанавливать или сбрасывать. Включение режима осуществляется командой
а выключение — командой
Перечислим основные режимы BASH:
Режим ignoreeof
Этот режим блокирования возможности выхода из оболочки с помощью комбинации клавиш Ctrl+d. Выход из оболочки с установленной опцией возможен только по команде exit. Этот режим используется для перестраховки при использовании комбинации клавиш Ctrl+d, которая часто используется и в других программах.
Режим noclobber
Данный режим используется для предотвращения записи новых файлов поверх существующих при переадресации вывода. В приведенном примере вторая команда при включенном режиме noclobber выдаст ошибку. Третья же команда ошибки не выдаст. Если файл myfile создается впервые, первая команда также не выдаст сообщения об ошибке.
О переадресации ввода и вывода смотри C.3.3.
Режим noglob
Режим используется для блокирования специальных символов регулярных выражений, используемых в шаблонах: *, ?,
, [, ]. В данном режиме эти символы можно использовать в именах файлов. Например, допустимым будет имя файла Why? . Однако использование регулярных выражений будет запрещено!
C.2.3.7. Пользовательские переменные.
Переменная MAILPATH
Эта переменная используется для указания путей для поиска дополнительных почтовых ящиков. Как уже указывалось в разделе C.2.3.5., в системе для каждого пользователя должен быть создан хотя бы один почтовый ящик. Однако не возбраняется каждому пользователю иметь несколько дополнительных почтовых ящиков, местонахождение которых и определяется этой переменной. Однако данная переменная не создается автоматически при создании учетных данных пользователя, и должна определяться отдельно.
В приведенном ниже примере задается путь для дополнительного почтового ящика, находящегося в директории /home/mail/yuri, если значение переменной LOGNAME равно yuri:
Переменная CDPATH
Аналога этой переменной нет в не UNIX-подобных операционных системах. С помощью этой переменной определяются каталоги, в которых команда cd ищет подкаталоги. Пусть, например, фрагмент дерева каталогов в LINUX системе такой:
задана переменная CDPATH:
и текущим является каталог /home/yuri/letters/old. Тогда следующая команда:
вызовет не ошибку, как при отсутствии переменной CDPATH, а вызовет переход в каталог /home/yuri/mail/myletters. Команда же
вызовет ошибку, так как путь к директории /home/yuri/letters не прописан в пути CDPATH.
Пользоваться этой переменной следует с осторожностью! Дело в том, что если указать в переменной CDPATH каталоги, имеющие подкаталоги с одинаковыми именами, то действие команды cd не предсказуемо!
Переменная TERM
Переменная определяет тип подключенного терминала. Эта информация нужна таким программам, как стандартные редакторы для определения режима ввода/вывода. Дело в том, что на разных терминалах (или консоли, как этот термин расшифровывается в MS-DOS) существуют различные раскладки клавиатуры, различные кодировки и виды символов. Как правило, если Вы регистрируетесь в системе с терминала, она сама правильно определяет его тип. Однако если Вам надо явно указать его вид, необходимо явно указать его значение. Аналогом этой переменной в DOS могут служить команды mode, chcp, keyb, программы — русификаторы экрана и клавиатуры и другие программы, управляющие переназначением клавиш и управляющие выводом символов на экран.
Переменная EXINIT
Данная переменная содержит команды, позволяющие конфигурировать редакторы Ex и Vi. Когда Вы вызываете эти редакторы, команды, указанные в переменной EXINIT, выполняются. Команды пишутся в одну строку, в кавычках. Опции с одинаковым префиксом записываются подряд.
Set tmp d garbage что она делает
Переменные среды Windows — ударение на «Ы» во втором слове (смысл фразы заложен в родительном падеже и верном ударении: переменные чего? — среды!), в англоязычных версиях виндовс — environment variable)

Переменные среды Windows используются для настройки операционных систем. Не каждому пользователю нужно разбираться с этими настройками и влезать в эти переменные, но есть пара переменных, о которых нужно знать всем пользователям персональных компьютеров. Речь идет о переменных, отвечающих за временное хранение файлов — TEMP и TMP.
По умолчанию значение пользовательских временных (TEMP) переменных – %USERPROFILE%\Local Settings\Temp,
По умолчанию значение системных временных переменных – \WINDOWS\Temp.
Поэтому в первом случае это обычно: «C:\Documents and Settings\USER\Local Settings\Temp«
Недорогой производительный Ультрабук:

Характеристики: экран 14,1 дюймов 1920*1080 ips, Windows 10, 8 ГБ ОЗУ, 256 ГБ M.2 SATA 2280 SSD, Wifi, подсветка клавиатуры.
По причине того, что в семействе операционных систем Windows папки с временными файлами сами собой почему-то не очищаются, в них может скопиться огромное множество различных ненужных файлов, достигающих общим размером до нескольких гигабайт! Среди временных файлов периодически прячутся различные вирусы и нехорошие скрипты, поэтому обязанность каждого пользователя ПК — регулярно удалять содержимое временных папок.
Для удобства удаления лучше изменить путь по умолчанию на более простой, самый оптимальный вариант — «C:\Temp«.
Как изменить Переменные среды Windows TEMP и TMP? — Очень просто:
1. Правый клик на значке «Мой компьютер» на рабочем столе (если это полноценный значок, а не ярлык) или через меню Пуск -> Мой компьютер — > Свойства:

2. Перейти на вкладку «Дополнительно» и кликнуть внизу на кнопку «Переменные среды«:

3. В верхнем окне «Переменные среды пользователя» выбрать сначала первую строку (переменную TEMP) и нажать кнопку «Изменить«:

4. Исправить значение переменной на более простое — «C:\Temp«:

5. Повторить пункты 3 и 4 для переменной TMP:

В итоге должно получиться:

6. Нажать поочередно 2 раза «ОК«.
В принципе тоже самое можно сделать с помощью командной строки, выполнив команду: SET TEMP=C:\TEMP
Все переменные среды Windows:
| ALLUSERSPROFILE | Указывает расположение профиля All Users (локальная переменная) |
| APPDATA | Указывает расположение каталога, в котором программы хранят данные по умолчанию (локальная переменная) |
| CD | Указывает имя текущего каталога (локальная переменная) |
| CMDCMDLINE | Указывает параметры командной строки, которые использовались для запуска текущего экземпляра программы CMD.EXE (локальная переменная) |
| CMDEXTVERSION | Указывает номер версии текущего расширения командного процессора (системная переменная) |
| COMPUTERNAME | Указывает имя компьютера (системная переменная) |
| COMSPEC | Указывает точный путь к исполняемому файлу командного интерпретатора (системная переменная) |
| DATE | Указывает текущую дату. Используется тот же формат, что и для команды date /t. Значение генерируется командным интерпретатором (системная переменная) |
| ERRORLEVEL | Указывает код уровня ошибки последней программы. Ненулевое значение, скорее всего, указывает на ошибку (системная переменная) |
| HOMEDRIVE | Указывает букву диска локальной рабочей станции, подключенной к домашнему каталогу. Переменная определяется на основе пути к домашнему каталогу. Домашний каталог пользователя определяется в оснастке Локальные пользователи и группы (Local Users and Groups) (системная переменная) |
| HOMEPATH | Указывает полный путь к домашнему каталогу пользователя. Переменная определяется на основе пути к домашнему каталогу. Домашний каталог пользователя определяется в оснастке Локальные пользователи и группы (Local Users and Groups) (системная переменная) |
| HOMESHARE | Указывает сетевой путь к общему домашнему каталогу пользователя. Переменная определяется на основе пути к домашнему каталогу. Домашний каталог пользователя назначается в оснастке Локальные пользователи и группы (Local Users and Groups) (системная переменная) |
| LOGONSERVER | Указывает имя контроллера домена, на котором авторизован текущий сеанс работы с системой (локальная переменная) |
| NUMBER_OF_PROCESSORS | Указывает количество процессоров, установленных в компьютере (системная переменная) |
| OS | Указывает версию операционной системы. ОС Windows XP/XP обозначаются, как Windows_NT (системная переменная) |
| PATH | Указывает путь поиска исполняемых файлов (системная переменная) |
| PATHEXT | Указывает список расширений, которые распознаются операционной системой, как расширения исполняемых файлов (системная переменная) |
| PROCESSOR_ARCHITECTURE | Указывает тип архитектуры процессора. Возможные значения: x86 и IA64 (системная переменная) |
| PROCESSOR_IDENTIFIER | Указывает описание процессора (системная переменная) |
| PROCESSOR_LEVEL | Указывает номер модели процессора, установленного в компьютере (системная переменная) |
| PROCESSOR_REVISION | Указывает номер версии модели процессора (системная переменная) |
| PROMPT | Указывает параметры приглашения командной строки для текущего интерпретатора. Генерируется интерпретатором CMD.EXE (локальная переменная) |
| RandOM | Указывает случайное десятичное число от 0 до 32767. Генерируется программой CMD.EXE (системная переменная) |
| SYSTEMDRIVE | Указывает букву диска, на котором расположен корневой каталог Windows (системная переменная) |
| SYSTEMROOT | Указывает путь к корневому каталогу Windows (системная переменная) |
| TEMP или TMP | Указывает путь к временным каталогам, принятым по умолчанию. Эти каталоги используются приложениями, доступными зарегистрированному в системе пользователю. Некоторым приложениям требуется значение переменной TEMP, в то время как другим — TMP (системная и пользовательская переменные соответственно) |
| TIME | Указывает текущее время. Используется тот же формат, что и для команды time /t. Генерируется интерпретатором CMD.EXE (системная переменная) |
| USERDOMAIN | Указывает имя домена, в котором хранится учетная запись пользователя (локальная переменная) |
| USERNAME | Указывает имя пользователя, который зарегистрирован в системе в текущий момент времени (локальная переменная) |
| USERPROFILE | Указывает путь к профилю текущего пользователя (локальная переменная) |
| WINDIR | Указывает путь к каталогу операционной системы (системная переменная) |
Чтобы получить доступ к значению переменной, необходимо поставить знак % перед её названием и после него, например: echo %NUMBER_OF_PROCESSORS%
korotkov-dmitry / 03-sysadmin-01-terminal Goto Github PK
Создайте директорию, в которой будут храниться конфигурационные файлы Vagrant. В ней выполните vagrant init . Замените содержимое Vagrantfile по умолчанию следующим:

Выполнение в этой директории vagrant up установит провайдер VirtualBox для Vagrant, скачает необходимый образ и запустит виртуальную машину. vagrant suspend выключит виртуальную машину с сохранением ее состояния (т.е., при следующем vagrant up будут запущены все процессы внутри, которые работали на момент вызова suspend), vagrant halt выключит виртуальную машину штатным образом.

5. Ознакомьтесь с графическим интерфейсом VirtualBox, посмотрите как выглядит виртуальная машина, которую создал для вас Vagrant, какие аппаратные ресурсы ей выделены. Какие ресурсы выделены по-умолчанию?
6. Ознакомьтесь с возможностями конфигурации VirtualBox через Vagrantfile: документация. Как добавить оперативной памяти или ресурсов процессора виртуальной машине?
Редактированием содержимого VagrantFile:
7. Команда vagrant ssh из директории, в которой содержится Vagrantfile, позволит вам оказаться внутри виртуальной машины без каких-либо дополнительных настроек. Попрактикуйтесь в выполнении обсуждаемых команд в терминале Ubuntu.
8. Ознакомиться с разделами man bash , почитать о настройках самого bash:
какой переменной можно задать длину журнала history , и на какой строчке manual это описывается?
HISTFILESIZE — строка 1214
что делает директива ignoreboth в bash?
ignoreboth — значение ignoreboth является сокращением для ignorespace и ignoredups . Использование этих значений позволяет не сохранять в HISTCONTROL , строки, начинающиеся с пробела и дубликаты.
9. В каких сценариях использования применимы скобки <> и на какой строчке man bash это описано?
Зарезервированный набор, используется в функциях, циклах для выбора последовательности. Строка 250.
10. Основываясь на предыдущем вопросе, как создать однократным вызовом touch 100000 файлов? А получилось ли создать 300000? Если нет, то почему?
Создание файлов, отработает.
Вызовет ошибку -bash: /usr/bin/touch: Argument list too long
11. В man bash поищите по /\[\[ . Что делает конструкция [[ -d /tmp ]]
Данная конструкция вычисляет выражение (проверяет наличие директории tmp на диске d ) и возвращает 0 если выражение имеет нулевое значение и 1 если не имеет.

12. Основываясь на знаниях о просмотре текущих (например, PATH) и установке новых переменных; командах, которые мы рассматривали, добейтесь в выводе type -a bash в виртуальной машине наличия первым пунктом в списке:
(прочие строки могут отличаться содержимым и порядком) В качестве ответа приведите команды, которые позволили вам добиться указанного вывода или соответствующие скриншоты.

13. Чем отличается планирование команд с помощью batch и at ?
14. Завершите работу виртуальной машины чтобы не расходовать ресурсы компьютера и/или батарею ноутбука.
Is it possible to boot in a way that doesn't delete /tmp?
Say I’m running some lengthy process, consisting of two steps: a generates a big intermediate file, say /tmp/aoutput , then b reads that file and does something further with it.
Now the system crashed during the b step. Is it possible to reboot the system in a way that will not delete the contents of /tmp , as would usually happen on boot, so that we can immediately restart b without first running a completely?
This assumes of course that /tmp is not mounted in tmpfs .
I’d like to preclude solutions that involve physically taking out the HDD/SSD or booting with a live USB medium. In my concrete situation now, it’s actually an SSD with full disk encryption, but I’d also be interested in solutions that only work with a non-encrypted drive.
edit Still keeping the question open for now, because neither of the answers gives a solution that works without either a live medium or tweaking the configuration beforehand. Maybe it’s really not possible any other way, but it seems odd: doesn’t GRUB already mount partitions, in order to boot Linux? If so, isn’t there a way to manually move the files, before ever launching systemd ? Perhaps I’m wrong, I know little about bootloaders; but then I’d like to hear the reason why this is impossible.
systemd configuration info:
3 Answers 3
TL;DR: Use a live medium if the crash just happened. Otherwise configure your system by copying /usr/lib/tmpfiles.d/tmp.conf to /etc/tmpfiles.d/tmp.conf and change the file in etc :
If your files don’t follow a specific pattern, then use the following settings instead:
Now the system crashed during the b step. Is it possible to reboot the system in a way that will not delete the contents of /tmp, as would usually happen on boot, so that we can immediately restart b without first running a completely?
Well, somewhat, if you can configure the system before the crash happens. If the system is already crashed at this very moment, then you must use a live medium, as every usual systemd.target ( rescue , multi-user , graphical ) includes the deletion of temporary files, even the rescue.target .
That being said, to be ready for the next crash, we can change your tmpfiles behavior. Most Debian-derived systems define the behaviour for /tmp in /usr/lib/tmpfiles.d/tmp.conf :
The line responsible for the cleanup is
As per tmpfiles.d(5) , a capital D indicates that the directory should get removed on systemd-tmpfiles —remove . Unfortunately that command runs on almost every target due to systemd-tmpfiles-setup.service :
Also, there are several timers that trigger a —clean operation and thus also remove old files.
Depending on your scenario, you have several solutions at hand, none of which are perfect.
Warning: Regardless of what you do, do not change /usr/lib/tmpfiles.d/ ‘s content. Instead, create a file with the same name in /etc/tmpfiles.d , e.g.
tmpfiles.d follows the usual systemd rules: /etc > /run > /usr/lib , i.e. /etc/ gets priority.
Option 1: Change the service permanently
/tmp gets removed due to —remove in the aforementioned service. You can systemctl edit the ExecStart argument to remove the —remove parameter:
The additional empty ExecStart is necessary to remove the original configuration. Alternatively run systemctl edit —full . and edit the resulting file.
As —remove is missing, D in all your configuration files is effectively disabled, which might not be helpful and thus discouraged by me. So instead you probably want to change the definition of your /tmp rule:
Option 2: Clean /tmp only for files of specific age
Copy /usr/lib/tmpfiles.d/tmp.conf to /etc/tmpfiles.d/tmp.conf and replace the D line
This will only delete files that are older than 12 hours instead of all files. If you reboot immediately after a crash, then this might be enough for you. However, we can even go a step further.
Option 3: Exclude project files
If your files always have the same name/pattern, we can prevent them from being deleted with an e x clusion:
Note that 1s will effectively remove all files when systemd-tmpfiles is called, except /tmp/*output files, e.g. /tmp/aoutput . You can also exclude whole folders.
The last variant should be sufficient for your problem and prevent you from getting a /tmp/ that’s too large.
Checking the configuration
After you’ve changed the configuration, it’s time to test it. This test is the same, regardless which variant you’ve used. Create files that have similar names in your /tmp and then run the systemd services:
If everything is set up correctly, your "project" files should still be there. If you’ve used the e x clusion variant, then the other garbage in /tmp/ should be gone.
design31 / 03-sysadmin-03-os Goto Github PK
1. Какой системный вызов делает команда cd ? В прошлом ДЗ мы выяснили, что cd не является самостоятельной программой, это shell builtin , поэтому запустить strace непосредственно на cd не получится. Тем не менее, вы можете запустить strace на /bin/bash -c ‘cd /tmp’ . В этом случае вы увидите полный список системных вызовов, которые делает сам bash при старте. Вам нужно найти тот единственный, который относится именно к cd . Обратите внимание, что strace выдаёт результат своей работы в поток stderr, а не в stdout.
Это тот самый в последней строке?
2. Попробуйте использовать команду file на объекты разных типов на файловой системе. Например:
Посмотрим что покажет file:
$ strace -o file_log file /home/vagrant/ . Сразу сложно сказать куда обращается file за поиском данных, но на странице man file есть упоминание:
FILES
/usr/share/misc/magic.mgc Default compiled list of magic.
/usr/share/misc/magic Directory containing default magic files.
И если грепнуть файл вывода strace то видно что туда file и обращается(помимо библиотек, конечно):
3. Предположим, приложение пишет лог в текстовый файл. Этот файл оказался удален (deleted в lsof), однако возможности сигналом сказать приложению переоткрыть файлы или просто перезапустить приложение – нет. Так как приложение продолжает писать в удаленный файл, место на диске постепенно заканчивается. Основываясь на знаниях о перенаправлении потоков предложите способ обнуления открытого удаленного файла (чтобы освободить место на файловой системе).
Сначала находим этот файл как-то так к примеру: lsof -p PIDпроцеса приложения | grep deleted , затем можно его обнулить скажем так: cat /dev/null > deleted_log_file . Конечно это не решит проблему навсегда, ведь приложение продолжает писать инфу в этот лог-файл.
Дополнение(спасибо за подсказку):
Делаем ping в файл ping_log, удаляем ping_log, убеждаемся что он (deleted) но размер растет:
Ограничим размер файла ping_log 10MB:
$ sudo truncate -s 0 /proc/8349/fd/1
4. Занимают ли зомби-процессы какие-то ресурсы в ОС (CPU, RAM, IO)?
Зомби-процессы не занимают память, но могут привести к тому что пользователь под которым они запущены не сможет запустить новые процессы. Зомби-процессы блокируют записи в таблице процессора и при достижении лимита это может стать проблемой и даже привести к невозможности пользователя подключиться к системе. Дисковая подсистема будет также нагружена в зависимости от размера файлов зомби-процесса, как я понял(поправьте если это не так).
5. В iovisor BCC есть утилита opensnoop :
На какие файлы вы увидели вызовы группы open за первую секунду работы утилиты? Воспользуйтесь пакетом bpfcc-tools для Ubuntu 20.04. Дополнительные сведения по установке.
6. Какой системный вызов использует uname -a ? Приведите цитату из man по этому системному вызову, где описывается альтернативное местоположение в /proc , где можно узнать версию ядра и релиз ОС.
Судя по выводу strace команда uname использует системные вызовы uname и arch_prtcl. Прошу ваш комментарий по этому вопросу. Сиистемных вызово там перечислено немало, но в основном стандартные — досту к памяти, открыть файл и т.д.
Из man 2 uname: Part of the utsname information is also accessible via /proc/sys/kernel/
7. Чем отличается последовательность команд через ; и через && в bash? Например:
Есть ли смысл использовать в bash && , если применить set -e ?
Последовательность команд через ; это просто последовательное выполнение команд, вне зависимости от результатов предыдущей команды. Если запустить их через && то команда 2 будет выполнена только в случае успешного завершения команды 1 и т.д.
По поводу set -e : очень смешно, я думал консоль глючит. Только потом почитал man и догнал о чём речь ) На полноценную замену && пожалуй не тянет. Но в случаях когда после какой-либо ошибки дальнейшее выполнение команд нежелательно может пригодиться.
8. Из каких опций состоит режим bash set -euxo pipefail и почему его хорошо было бы использовать в сценариях?
По порядку: опция -e означает что оболочка закроется если команда, составная команда или список команд вернётся с результатом отличным от нуля.
-u: При раскрытии параметров рассматривать неустановленные переменные и параметры, отличные от специальных параметров «@» и «*», как ошибку. Если выполняется попытка раскрытия неустановленной переменной или параметра, оболочка печатает сообщение об ошибке и, если не интерактивно, завершает работу с ненулевым статусом. Эту опцию не совсем понял, если честно.
-x: После выполнения каждой простой команды показывает развернутое значение команды и её аргументов для команд case, for и select.
-o pipefail: Если установлено, возвращаемое значение конвейера — это значение последней (самой правой) команды для выхода с ненулевым статусом или ноль, если все команды в конвейере завершаются успешно. По умолчанию эта опция отключена.
Удобство таких опций в наглядности результата при успешном выполнении и безопасном завершении шелла при ошибках, я так понял.
9. Используя -o stat для ps , определите, какой наиболее часто встречающийся статус у процессов в системе. В man ps ознакомьтесь ( /PROCESS STATE CODES ) что значат дополнительные к основной заглавной буквы статуса процессов. Его можно не учитывать при расчете (считать S, Ss или Ssl равнозначными).
Наиболее часто встречаются процессы с STAT равным S, Ss и Ssl (прерываемый сон), ожидающие дальнейшей команды/сигналов.