Как сделать сценарий Scala автономным в Linux?

Предоставленное решение не работает для меня, потому что процесс был завершен до фактического завершения команды ожидания. Я обнаружил, что статья http://veithen.github.io/2014/11/16/sigterm-propagation.html, последний фрагмент хорошо работает в моем случае приложения, запущенного в OpenShift с пользовательским исполнителем sh. Сценарий sh необходим, потому что мне нужна возможность получать дампы потоков, что невозможно, если PID процесса Java равен 1.

trap 'kill -TERM $PID' TERM INT
$JAVA_EXECUTABLE $JAVA_ARGS &
PID=$!
wait $PID
trap - TERM INT
wait $PID
EXIT_STATUS=$?

0
18.03.2020, 14:33
1 ответ

В sh,

# src/main/scala/progscala2/toolslibs/secho

— комментарий, который игнорируется;

exec scala "$0" "$@"

заставляет текущий процесс заменить себя на scalaи все параметры оболочки в качестве аргументов;

!#

не имеет никакого эффекта, так как в этот момент оболочка прекратила чтение скрипта.

Однако Scala обрабатывает файлы сценариев, игнорируя «заголовок» в начале файла; этот заголовок начинается со строки, начинающейся с#!(или ::#!в Windows )и заканчивается строкой , соответствующей либо !#(::!#), либо/env. Заголовок может быть одной строкой, поэтому оба

#!/path/to/scala
!#
print("You entered: ")
args.toList foreach { s => printf("%s ", s) }
println

и

#!/usr/bin/env scala
print("You entered: ")
args.toList foreach { s => printf("%s ", s) }
println

работа (последний требует, чтобы scalaбыл наPATH). Последний соответствует документации .

(!#является симметричным #!и используется в Scala для закрытия «заголовка», открытого #!, аналогично /*и */для комментариев в C.)

4
28.04.2021, 23:20

Теги

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