2010-10-04 4 views
3

Я искал какое-то время, но я не могу найти ответ или придумать свое решение, поэтому я обращаюсь к вам, ребята. Первый вопрос, который я на самом деле здесь спросить :)Перенаправление стандартного вывода в файл, содержащий pid процесса ведения журнала

Я хотел бы запустить несколько экземпляров одного и того же программы, и перенаправить каждый из этих программ стандартный вывод в файл, который содержит тот же самый процесс Pid, ​​что-то вроде:

my_program > <pid of the instance of my_program that is called in this command>.log 

Я знаю, что это даже не приближается к пути: PI возился с exec и $ PPID, но безрезультатно. Мой баш-фу слабый: | помогите мне, назовите меня где-нибудь! Благодаря!

ответ

3

Проблема заключается в том, что каждый новый процесс, начатый bash, получает новый PID, и вы должны перенаправить вывод этого процесса перед его запуском. Но вы не можете сказать, какой PID будет назначен этому процессу ОС.

Решение этой проблемы заключается не в том, чтобы начать новый процесс, а в замене существующего процесса bash новым, используя exec.

Вот пример. Во-первых, мы пишем основную программу C, которая выводит его PID:

// printpid.c 

#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 

int main() 
{ 
    printf ("C process pid is %d\n", getpid()); 
    return 0; 
} 

Тогда мы пишем простой Баш скрипт, который будет печатать его PID и заменить себя с этой программой с помощью Exec:

#!/bin/bash 
# printpid.sh 

echo Bash process PID is $$ 
exec ./printpid > $$.log 

Теперь, давайте напишем сценарий, который будет вызывать этот скрипт printpid.sh несколько раз:

#!/bin/bash 
# example.sh 

./printpid.sh 
./printpid.sh 
./printpid.sh 

Теперь, давайте удостоверимся, что он работает:

$ ls 
example.sh printpid printpid.c printpid.sh 
$ ./example.sh 
Bash process PID is 6397 
Bash process PID is 6398 
Bash process PID is 6399 
$ ls 
6397.log 6398.log 6399.log example.sh printpid printpid.c printpid.sh 
$ cat 6397.log 
C process pid is 6397 
$ cat 6398.log 
C process pid is 6398 
$ cat 6399.log 
C process pid is 6399 
$ 

Имейте в виду, что, когда вы используете exec вы не можете что-либо еще после этого поместить в сценарий, как Баш оболочка заменяет себя новый процесс, указанный в качестве аргументов командной строки для exec.

Удача взлома!

+0

Как бы я сделать это для процесса, который я хочу, чтобы фон? Я хочу перенаправить вывод моего обработанного процесса в файл с именем PID этого процесса. 'exec bash -c 'sleep 10; echo hi"> ~/tmp/$$ 2> & 1 & disout $! ' –

2

Если у вас есть Баш 3 или более поздней версии, вы можете объединить Подоболочки, Exec и $ {} BASHPID

То есть, создать подоболочку с(), а затем настроить перенаправление < Pid из подоболочки > .log и exec my_program, который должен заменить процесс-образ подоболочки, наследуя его pid (между прочим).

(exec my_program >${BASHPID}.log)

Смежные вопросы