Перенаправление стандартного вывода в файл, содержащий pid процесса регистрации - PullRequest
3 голосов
/ 04 октября 2010

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 04 октября 2010

Проблема здесь в том, что каждый новый процесс, запускаемый 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;
}

Затем мы пишем простой bash-скрипт, который распечатает свой 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, вы не можете поместить что-либо еще после этого в сценарий, поскольку оболочка bash заменяет себя новым процессом, указанным в качестве аргументов командной строки для exec.

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

2 голосов
/ 04 октября 2010

Если у вас bash 3 или новее, вы можете комбинировать подоболочки, exec и $ {BASHPID}

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

( exec my_program >${BASHPID}.log )

...