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

я создаю ловушку после получения для моего репозитория развертывания.
Хук компилирует и выполняет мою программу. Программа выводит несколько строк, которые я хотел бы видеть, разветвляется и продолжается только в разветвленном процессе.
Когда я запускаю программу с 2>&1 1>/dev/null & он работает нормально, хотя я не вижу никакого выхода из этого. Я пробовал звонить setsid() после fork, но затем git commit не останавливается, он продолжает выводить выходные данные программы.

Есть идеи для решения?

1

Решение

Когда вы разветвляете свою программу; оба они имеют доступ к потоку stdout / err; который git hook скорее всего ожидает закрытия.

Решить вашу проблему; Если ваш разветвленный процесс, который продолжается, закрывает свой дескриптор для stdout, stderr и stdin;

close(fileno(stdin));
close(fileno(stdout));
close(fileno(stderr));

а также начало новой сессии setsid() (что вы и сделали), это станет совершенно отдельным процессом от вашего, скоро ставшего мертвым, процесса.

Обратите внимание, что попытка вывести что-либо впоследствии будет неопределенным поведением, если оставить его как есть.

Если вы хотите продолжать использовать только cout или же cerr в этом процессе, я бы предложил вам перенаправить его с помощью rdbuf как вы могли в этот момент после разветвления, перенаправьте stdout и stderr на /dev/null

Если вы хотите использовать printf или что-то из его семейства, тогда вам придется повторно привязать дескриптор файла stdout к чему-либо.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]