Запустить сценарий с пользовательским вводом, а затем отключить задание и запустить его в фоновом режиме

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

Чтобы извлечь 9-й столбец:

$ cut -f 9 data.gtf
gene_id "strAD1.1"; transcript_id "strAD1.1.1"; reference_id "ENST00000469289"; ref_gene_id "ENSG00000243485"; ref_gene_name "MIR1302-10"; cov "0.028725"; FPKM "0.053510"; TPM "0.109957";
gene_id "strAD1.1"; transcript_id "strAD1.1.1"; exon_number "1"; reference_id "ENST00000469289"; ref_gene_id "ENSG00000243485"; ref_gene_name "MIR1302-10"; cov "0.014218";
gene_id "strAD1.1"; transcript_id "strAD1.1.1"; exon_number "2"; reference_id "ENST00000469289"; ref_gene_id "ENSG00000243485"; ref_gene_name "MIR1302-10"; cov "0.072139";

Чтобы получить из этого данные, которые нам нужны, нам нужно обрабатывать транскрипты и экзоны отдельно, поскольку их атрибуты имеют разный порядок в данных. Мы делаем это с помощью awkи выводим разные поля во входных данных в зависимости от того, содержит ли текущая строка строку exon_numberили нет:

$ cut -f 9 data.gtf | awk '/exon_number/ { print $2, $4, $8, $10; next } { print $2, $4, $6, $8 }'
"strAD1.1"; "strAD1.1.1"; "ENST00000469289"; "ENSG00000243485";
"strAD1.1"; "strAD1.1.1"; "ENST00000469289"; "ENSG00000243485";
"strAD1.1"; "strAD1.1.1"; "ENST00000469289"; "ENSG00000243485";

Затем мы удаляем двойные кавычки и точки с запятой из этого:

$ cut -f 9 data.gtf | awk '/exon_number/ { print $2, $4, $8, $10; next } { print $2, $4, $6, $8 }' | tr -d '";'
strAD1.1 strAD1.1.1 ENST00000469289 ENSG00000243485
strAD1.1 strAD1.1.1 ENST00000469289 ENSG00000243485
strAD1.1 strAD1.1.1 ENST00000469289 ENSG00000243485
3
12.08.2019, 21:29
2 ответа

Этого можно добиться, подражая тому, что делает nohupво второй части вашего скрипта.

Команда nohupне делает больше, чем:

  • Перенаправить стандартные файловые дескрипторы, чтобы скрипт не пытался читать или писать в терминал.

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

Этого можно добиться с помощью следующего скрипта:

echo "What is limit for low level optimization?" #ask for low limit
read low
echo "What is limit for high level optimization?" #ask for high limit
read high
echo "What method?" #ask for method
read input 
(
    trap '' 1  # Ignore SIGHUP
    # Series of long running commands
    # using $low, $high and $input
) </dev/null >myscript.log 2>&1 &

Последняя строка перенаправит stdin из /dev/null и из stdout и stderr вmyscript.log(вы можете выбрать лучшее имя файла и, возможно, использовать метку времени или что-то подобное, чтобы сделать его уникальным.)

Наконец, вы переводите весь процесс в фоновый режим с помощью final &.

Еще одна возможность состоит в том, чтобы разделить ваш скрипт на две части, чтобы второй принимал low, highи inputв качестве аргументов строки команды -или, возможно, в качестве экспортированных переменных среды, а затем запускал второй часть с использованием фактической команды nohup. Это должно быть проще и несколько гибче, поскольку вы можете запускать сценарий выполнения второй части без необходимости иметь дело с интерактивными подсказками.

Другой возможностью является использование терминальных мультиплексоров, таких как tmuxили screen, чтобы вы могли повторно подключиться к сеансу, если вы отключились (или вы можете отключить его самостоятельно ), также вы можете открыть новое окно для запуска новой оболочки, в то время как ваш скрипт продолжает работать в исходном окне. Независимо от того, реализуете ли вы одно из приведенных выше решений, использование tmuxили screenбыло бы хорошей идеей, так что попробуйте, если сможете.

1
27.01.2020, 21:29

Вы можете заключить длинную последовательность команд в фигурные скобки, а затем использовать & для продолжения без ожидания.

echo "Read input"
{
    # all your commands in curly braces
    #...
} & exit 0

Затем вы можете выйти, не дожидаясь завершения всех ваших команд. Он должен продолжать работать, даже если вы отключитесь от сервера.

0
27.01.2020, 21:29

Теги

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