Linux как посмотреть stderr

Как получить stderr в Linux?

Обычно на ваш терминал выводятся STDOUT и STDERR. Но можно перенаправить и то, и другое. Например, данные, отправленные сценарием CGI в STDERR, обычно попадают в файл журнала, указанный в конфигурации веб-сервера. Программа может получить информацию о STDERR в системе Linux.

Что такое команда stderr в Linux?

Stderr, также известная как стандартная ошибка, дескриптор файла по умолчанию, где процесс может писать сообщения об ошибках. В Unix-подобных операционных системах, таких как Linux, macOS X и BSD, stderr определяется стандартом POSIX. … В терминале стандартная ошибка по умолчанию отображается на экране пользователя.

Как мне захватить файл stderr?

Чтобы также перенаправить stderr, у вас есть несколько вариантов:

  1. Перенаправить stdout в один файл, а stderr в другой файл: command > out 2 > error.
  2. Перенаправить стандартный вывод в файл ( >out ), а затем перенаправить стандартный вывод в стандартный вывод ( 2>&1 ): command >out 2>&1.

Где хранится stderr?

По умолчанию stderr обычно подключается к тому же месту, что и стандартный вывод, то есть текущий терминал. В противном случае вы не увидите ошибок, которые будут немного раздражать. Вот сообщение в блоге о перенаправлении stderr на механизм ведения журнала системы. stderr — это поток.

Что такое стандартное устройство вывода Linux?

Основной рабочий процесс любой команды Linux заключается в том, что она принимает входные данные и выдает выходные данные. Стандартным устройством ввода (stdin) является клавиатура. Стандартное устройство вывода (stdout) экран.

Куда идет стандартный вывод в Linux?

Стандартный вывод, созданный во время создания процесса, переходит к консоли, вашему терминалу или X-терминалу. Точное место отправки выходных данных явно зависит от того, где возник процесс. бы [con]привязать файл по умолчанию к нашему стандартному выводу, т.е. к нашей консоли или экрану терминала.

Как работает grep в Linux?

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

Как вы перенаправляете вывод?

В командной строке перенаправление — это процесс использования ввода/вывода файла или команды для использования его в качестве ввода для другого файла. Он похож, но отличается от каналов, поскольку позволяет читать/записывать файлы, а не только команды. Перенаправление может быть выполнено с помощью используя операторы > и >> .

Читайте также:  Linux клон mac os

Как вы будете перенаправлять сообщение об ошибке, приведите пример?

  1. Чтобы перенаправить stderr (стандартную ошибку) в файл: команда 2> errors.txt.
  2. Давайте перенаправим и stderr, и stdout (стандартный вывод): command &> output.txt.
  3. Наконец, мы можем перенаправить stdout в файл с именем myoutput.txt, а затем перенаправить stderr в stdout, используя 2>&1 (errors.txt):

Как перенаправить стандартный вывод?

Другое распространенное использование для перенаправления вывода: перенаправление только stderr. Чтобы перенаправить дескриптор файла, мы используем N> , где N — дескриптор файла. Если дескриптора файла нет, то используется stdout, например, echo hello > new-file .

Источник

See stdin/stdout/stderr of a running process — Linux kernel

Is there a way to redirect/see the stdin/stdout/stderr of a given running process(By PID) in a simple way ? I tried the following (Assume that ‘pid’ contains a running user process):

int foo(const void* data, struct file* file, unsigned fd) < printf("Fd = %x\n", fd); return 0; >struct task_struct* task = pid_task(find_vpid(pid), PIDTYPE_PID); struct files_struct* fs = task->files; iterate_fd(fs, 0, foo, NULL); 

I get 3 calls to foo (This process probably has 3 opened files, makes sense) but I can’t really read from them (from the file pointers). It prints:

2 Answers 2

First, if you can change your architecure, you run it under something like screen, tmux, nohup, or dtach which will make your life easier.

But if you have a running program, you can use strace to monitor it’s kernel calls, including all reads/writes. You will need to limit what it sees (try -e ), and maybe filter the output for just the first 3 FDs. Also add -s because the default is to limit the size of data recorded. Something like: strace -p -e read,write -s 1000000

You can achieve it via gdb

Check the file handles process() has open :

$ ls -l /proc/6760/fd total 3 lrwx—— 1 rjc rjc 64 Feb 27 15:32 0 -> /dev/pts/5 l-wx—— 1 rjc rjc 64 Feb 27 15:32 1 -> /tmp/foo1 lrwx—— 1 rjc rjc 64 Feb 27 15:32 2 -> /dev/pts/5 
$ gdb -p 6760 /bin/cat GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1 Copyright (C) 2014 Free Software Foundation, Inc. [lots more license stuff snipped] Attaching to program: /bin/cat, process 6760 [snip other stuff that’s not interesting now] (gdb) p close(1) $1 = 0 

Provide a new file name to get output — process_log

(gdb) p creat(“/tmp/process_log″, 0600) $2 = 1 (gdb) q The program is running. Quit anyway (and detach it)? (y or n) y Detaching from program: /bin/cat, process 6760 

After that verify the result as:

ls -l /proc/6760/fd/ total 3 lrwx—— 1 rjc rjc 64 2008-02-27 15:32 0 -> /dev/pts/5 l-wx—— 1 rjc rjc 64 2008-02-27 15:32 1 -> /tmp/process_log /dev/pts/5 

In the similar way, you can redirect stdin, stderr too.

Читайте также:  Windows vista linux theme

Источник

echo or print /dev/stdin /dev/stdout /dev/stderr

stdin , stdout , and stderr are streams attached to file descriptors 0, 1, and 2 respectively of a process.

At the prompt of an interactive shell in a terminal or terminal emulator, all those 3 file descriptors would refer to the same open file description which would have been obtained by opening a terminal or pseudo-terminal device file (something like /dev/pts/0 ) in read+write mode.

If from that interactive shell, you start your script without using any redirection, your script will inherit those file descriptors.

On Linux, /dev/stdin , /dev/stdout , /dev/stderr are symbolic links to /proc/self/fd/0 , /proc/self/fd/1 , /proc/self/fd/2 respectively, themselves special symlinks to the actual file that is open on those file descriptors.

They are not stdin, stdout, stderr, they are special files that identify what files stdin, stdout, stderr go to (note that it’s different in other systems than Linux that have those special files).

reading something from stdin means reading from file descriptor 0 (which will point somewhere within the file referenced by /dev/stdin ).

Except in the special case of terminal devices open in read+write mode, stdout and stderr are usually not open for reading. They are meant to be streams that you write to. So reading from the file descriptor 1 will generally not work. On Linux, opening /dev/stdout or /dev/stderr for reading (as in $(open a socket).

In our case of the script run without redirection at the prompt of an interactive shell in a terminal, all of /dev/stdin, /dev/stdout and /dev/stderr will be that /dev/pts/x terminal device file.

Reading from those special files returns what is sent by the terminal (what you type on the keyboard). Writing to them will send the text to the terminal (for display).

in bash (and bash only), it’s important to realise that inside $(. ) , stdout has been redirected. It is now a pipe. In the case of bash , a child shell process is reading the content of the file (here /dev/stdout ) and writing it to the pipe, while the parent reads from the other end to make up the expansion.

Читайте также:  Yum repo oracle linux

In this case when that child bash process opens /dev/stdout , it is actually opening the reading end of the pipe. Nothing will ever come from that, it’s a deadlock situation.

If you wanted to read from the file pointed-to by the scripts stdout, you’d work around it with:

That would duplicate the fd 1 onto the fd 3, so /dev/fd/3 would point to the same file as /dev/stdout.

#! /bin/bash - printf 'content of file on stdin: %s\n' "$( 3 
echo bar > err echo foo | myscript > out 2>> err 

You'd see in out afterwards:

content of file on stdin: foo content of file on stdout: content of file on stdin: foo content of file on stderr: bar 

If as opposed to reading from /dev/stdin , /dev/stdout , /dev/stderr , you wanted to read from stdin, stdout and stderr (which would make even less sense), you'd do:

#! /bin/sh - printf 'what I read from stdin: %s\n' "$(cat)" < printf 'what I read from stdout: %s\n' "$(cat <&3)"; >3 

If you started that second script again as:

echo bar > err echo foo | myscript > out 2>> err 
what I read from stdin: foo what I read from stdout: what I read from stderr: 
bar cat: -: Bad file descriptor cat: -: Bad file descriptor 

For stdout and stderr, cat fails because the file descriptors were open for writing only, not reading, the the expansion of $(cat <&3) and $(cat <&2) is empty.

echo out > out echo err > err echo foo | myscript 1<> out 2<> err 

(where <> opens in read+write mode without truncation), you'd see in out :

what I read from stdin: foo what I read from stdout: what I read from stderr: err 

You'll notice that nothing was read from stdout, because the previous printf had overwritten the content of out with what I read from stdin: foo\n and left the stdout position within that file just after. If you had primed out with some larger text, like:

echo 'This is longer than "what I read from stdin": foo' > out 
what I read from stdin: foo read from stdin": foo what I read from stdout: read from stdin": foo what I read from stderr: err 

Источник

Оцените статью
Adblock
detector