Предоставленное решение не работает для меня, потому что процесс был завершен до фактического завершения команды ожидания. Я обнаружил, что статья 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=$?
В 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.)