Странное поведение SIGHUP

Обновлено на основе вашего обновленного вопроса

Чтобы прочитать базы данных из файла, который вы передаете в качестве аргумента, вы можете использовать

for File in $(< "$1"); do
    echo `date +'%m-%d-%Y %H:%M:%S'` "starting $File execute" > $Import_Success_Log
   ./cli.sh -a execute -i IPROD_$File -fn formrnt -user -password>> $Import_Success_Log
    echo `date +'%m-%d-%Y %H:%M:%S'` "$File execute completed" >> $Import_Success_Log
done

(и аналогично для всех остальных петель)

, а затем назовите его как

sh your-script file.txt

Скрипты можно вызывать с аргументами, они будут доступны в $1, $2и т.д. Так что в вашем случае вы можете сделать

File="$1"
echo `date +'%m-%d-%Y %H:%M:%S'` "starting $File execute" > $Import_Success_Log
./cli.sh -a execute -i "IPROD_$File" -fn formrnt -user -password>> $Import_Success_Log
echo `date +'%m-%d-%Y %H:%M:%S'` "$File execute completed" >> $Import_Success_Log
./cli.sh -authfile "$AuthFile" -a list -t area -nof > $Import_List_File

imp_area=`grep -iw "PRD_$File" "$IGC_Import_List_File" | grep -i prod`;

, а затем вызовите скрипт как

sh your-script filename

PS :Это предполагает, что в остальной части скрипта (, особенно в части, выполняемой перед вашим фрагментом ), значение $1не изменяется по какой-либо причине.

0
15.10.2021, 06:58
1 ответ

Это нормально.

Оболочка завершается, так как SIGHUP обычно отправляется в оболочку, когда управляющий терминал уходит (т. е. это интерфейс отзыва ресурсов, один из очень немногих в Unix ), и оболочка без терминал бессмысленный.

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

Например, этот механизм очищается, когда вы используете tail -fдля просмотра файла журнала, а затем закрываете окно Терминала. И оболочка, и работающая в ней команда tailпросто стали бесполезными, поскольку у них нет терминала для взаимодействия, поэтому они также завершаются.

Обычно «осиротевшие» процессы присоединяются к PID 1, так как это единственный процесс, от которого можно ожидать обработки SIGCHLD и сбора кода выхода дочернего процесса. Предположительно, systemd делает что-то интересное, вместо этого подключая его к пользовательскому экземпляру systemd, что также выполняет этот контракт.

0
15.10.2021, 09:22

Теги

Похожие вопросы