Как заставить процесс работать в фоновом режиме, даже если он отказывается?

Bash поддерживает здесь документы и здесь строки для обеспечения стандартного ввода в программу из строки. Следующее:

./myprogram <

даст myprogram три строки ввода, которые являются значениями lat1 , lon1 и filename1 переменные. Если вы поместите это в цикл, который каждый раз устанавливает переменные соответствующим образом, вы будете запускать myprogram много раз, каждый раз с разным стандартным вводом.

отмечает здесь документ: это означает читать следующие строки до тех пор, пока не будет просто сказано « EOT », и предоставить это в качестве стандартного ввода для программы (например, делает для файла). Вы можете использовать все, что захотите, вместо EOT , если оно одинаково в обоих местах.

Вы также можете использовать здесь строку:

./myprogram <<<"$lat
$lon
$filename"

Это делает то же самое, но вместо этого с многострочным строковым литералом. берет заданную строку и передает ее как стандартный ввод, как указано выше. Однако я бы предпочел версию heredoc.


Альтернативный подход, который работает даже в POSIX sh , заключается в том, чтобы просто создать соответствующий файл:

echo $lat > file
echo $lon >> file
echo $filename >> file
./myprogram < file

Этот документ лучше, если вы можете его использовать, хотя я предполагаю, что вы можете, поскольку это помечен как "bash".

Еще одна опция использует \ n escape-последовательности и либо echo , либо printf :

printf '%s\n%s\n%s\n' "$lat" "$lon" "$filename" | ./myprogram
echo -e "$lat\n$lon\n$filename" | ./myprogram

-e является обычным расширением для ] echo , поддерживаемый Bash и другими оболочками. printf должен работать в любой POSIX-совместимой системе.

1
07.10.2015, 09:54
2 ответа

Используйте следующее:

today_date="$(date +%Y%m%d)" # use $(...) to assign the output of a command to a variable
declare -a nodeid=(...)

for id in "${nodeid[@]}"; do
  [ -e "${today_date}_MPS_Cust_dump_${id}.list.Z" ] || echo "$id is not downloaded"
done | mail -E -s "Subject" user@example.com

  • Цикл for проходит через каждый элемент массива nodeid .
    • [-e ""...] проверяет, существует ли файл с заданным именем в текущем каталоге
    • | | echo... "" печатает сообщение, если файл не существует
  • | mail... все передается на почту , -s определяет тему, -E не отправляет сообщение, когда тело пустое (все файлы существуют), а последним аргументом является адрес.
-121--228784-

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

-121--228785-

Интерактивные процессы, отправляемые в фоновый режим, приостанавливаются при попытке чтения входных данных с терминала. Можно использовать терминальный мультиплексор, например, screen

screen -d -m vim

Это позволяет создать новый сеанс экрана и автоматически отсоединить его. Используйте экран -r для повторного подключения к нему.

1
27.01.2020, 23:49

Я не знаю, правильно это или неправильно, если мы делаем

ping google.com &

, тогда он все еще работает, но если мы делаем

cat >abc.txt &

, он не работает. Причина этого может быть интерактивным процесс остановлен, потому что вы можете делать что угодно, когда этот процесс находится в фоновом режиме, поэтому экономьте ресурсы

0
27.01.2020, 23:49

Теги

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