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