кошка <file.txt, Кто ответственным из чтения является файл?

В основном у Вас есть две опции:

  1. используйте a cron задание с @reboot спецификация времени (см. crontab(1) страница справочника для деталей)

  2. запустите его init системой. Поскольку BSD/SysV init разрабатывает, это означает добавлять сценарий где-нибудь, чтобы быть выполненным в желаемом runlevel. Для systemd это включает создание файла единицы и требование его желаемой целью.

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

3
22.04.2015, 01:57
2 ответа

Для команды оболочки Cat :

  1. Оператор перенаправления < вызывает открытую оболочку File.txt для чтения.
  2. Оболочка выполняет команду CAT , со своим стандартным входом, подключенным к File.txt .
  3. Команда CAT считывается со своего стандартного ввода (SO file.txt ) и копирует контент на свой стандартный выход.

Итак, оболочка - это одно открытие файла, но команда CAT - это то, что читает данные.

Вы можете наблюдать, что происходит, перечисляя системные вызовы, выполняемые оболочкой и его подпроцессами. На Linux:

$ strace -f sh -c 'cat <file.txt' >/dev/null
execve("/bin/sh", ["sh", "-c", "cat <file.txt"], [/* 76 vars */]) = 0
…
open("file.txt", O_RDONLY) = 3
…
dup2(3, 0)                              = 0
…
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fbc737539d0) = 22703
[pid 22702] wait4(-1,  <unfinished ...>
[pid 22703] execve("/bin/cat", ["cat"], [/* 76 vars */]) = 0
[pid 22703] read(0, "wibble"..., 32768) = 6
[pid 22703] write(1, "wibble"..., 6) = 6
[pid 22703] read(0, "", 32768)          = 0
[pid 22703] close(0)                    = 0
[pid 22703] close(1)                    = 0
[pid 22703] close(2)                    = 0
[pid 22703] exit_group(0)               = ?
<... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 22703
--- SIGCHLD (Child exited) @ 0 (0) ---
rt_sigreturn(0x11)                      = 22703
…

(22702 - это процесс Ratear Shell, 22703 - это ребенок CAT )

Команда оболочки CAT File.txt работает по-разному.

  1. Оболочка выполняет команду CAT , передавая его один параметр, а именно file.txt .
  2. Откроется программа file.txt для чтения.
  3. Команда CAT считывается из file.txt и копирует контент на его стандартный выход.
6
27.01.2020, 21:16

Вы правы. Хотя это не имеет значения во многих ситуациях, если оболочка и процесс имеют разные разрешения, которые могут.

Если этот процесс, который вы вызываете, имеет повышенные привилегии (например, Sudo или SETUID), то он может использовать эти привилегии для открытия файлов, чтобы ваша оболочка не сможет.

$ sudo cat < /etc/shadow | wc
-bash: /etc/shadow: Permission denied
      0       0       0
$ sudo cat /etc/shadow | wc
     64      64    1843
-1
27.01.2020, 21:16

Теги

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