diff --git a/src/psij/launchers/scripts/aprun_launch.sh b/src/psij/launchers/scripts/aprun_launch.sh index bd586ade..6f3e5dbf 100644 --- a/src/psij/launchers/scripts/aprun_launch.sh +++ b/src/psij/launchers/scripts/aprun_launch.sh @@ -1,6 +1,6 @@ #!/bin/bash -source $(dirname "$0")/launcher_lib.sh +source "${0%/*}/launcher_lib.sh" _PSI_J_PROCESS_COUNT="$1" shift @@ -8,7 +8,7 @@ shift pre_launch set +e -aprun -n $_PSI_J_PROCESS_COUNT "$@" 1>$_PSI_J_STDOUT 2>$_PSI_J_STDERR <$_PSI_J_STDIN +aprun -n "$_PSI_J_PROCESS_COUNT" "$@" 1>"$_PSI_J_STDOUT" 2>"$_PSI_J_STDERR" <"$_PSI_J_STDIN" _PSI_J_EC=$? set -e @@ -16,4 +16,4 @@ log "Command done: $_PSI_J_EC" post_launch -exit $_PSI_J_EC +exit "$_PSI_J_EC" diff --git a/src/psij/launchers/scripts/jsrun_launch.sh b/src/psij/launchers/scripts/jsrun_launch.sh index 80fdcff4..4aca56ec 100755 --- a/src/psij/launchers/scripts/jsrun_launch.sh +++ b/src/psij/launchers/scripts/jsrun_launch.sh @@ -1,6 +1,6 @@ #!/bin/bash -source $(dirname "$0")/launcher_lib.sh +source "${0%/*}/launcher_lib.sh" _PSI_J_PROCESS_COUNT="$1" shift @@ -8,7 +8,7 @@ shift pre_launch set +e -jsrun -p $_PSI_J_PROCESS_COUNT --np 1 "$@" 1>$_PSI_J_STDOUT 2>$_PSI_J_STDERR <$_PSI_J_STDIN +jsrun -p "$_PSI_J_PROCESS_COUNT" --np 1 "$@" 1>"$_PSI_J_STDOUT" 2>"$_PSI_J_STDERR" <"$_PSI_J_STDIN" _PSI_J_EC=$? set -e @@ -16,4 +16,4 @@ log "Command done: $_PSI_J_EC" post_launch -exit $_PSI_J_EC +exit "$_PSI_J_EC" diff --git a/src/psij/launchers/scripts/launcher_lib.sh b/src/psij/launchers/scripts/launcher_lib.sh index ac83cd5b..cb755b5e 100755 --- a/src/psij/launchers/scripts/launcher_lib.sh +++ b/src/psij/launchers/scripts/launcher_lib.sh @@ -1,12 +1,26 @@ set -e +# abspath Source - https://stackoverflow.com/a/23002317 +# Posted by Alexander Klimetschek, modified by community. See post 'Timeline' for change history +# Retrieved 2026-03-26, License - CC BY-SA 3.0 + +function _psi_j_abspath() { + if [[ $1 = /* ]]; then + echo "$1" + elif [[ $1 == */* ]]; then + echo "$(cd "${1%/*}"; pwd)/${1##*/}" + elif [ -n "$1" ]; then + echo "$(pwd)/$1" + fi +} + _PSI_J_JOB_ID="$1" -_PSI_J_LOG_FILE="$2" -_PSI_J_PRE_LAUNCH="$3" -_PSI_J_POST_LAUNCH="$4" -_PSI_J_STDIN="$5" -_PSI_J_STDOUT="$6" -_PSI_J_STDERR="$7" +_PSI_J_LOG_FILE=$(_psi_j_abspath "$2") +_PSI_J_PRE_LAUNCH=$(_psi_j_abspath "$3") +_PSI_J_POST_LAUNCH=$(_psi_j_abspath "$4") +_PSI_J_STDIN=$(_psi_j_abspath "$5") +_PSI_J_STDOUT=$(_psi_j_abspath "$6") +_PSI_J_STDERR=$(_psi_j_abspath "$7") shift 7 @@ -14,12 +28,23 @@ if [ "$_PSI_J_LOG_FILE" == "" ]; then _PSI_J_LOG_FILE="/dev/null" fi -ts() { - while read LINE; do - TZ=UTC TS=`date '+%Y-%m-%d %H:%M:%S'` - echo "$TS $_PSI_J_JOB_ID $LINE" - done -} +if [ "${BASH_VERSINFO[0]}" -gt 4 ] || { [ "${BASH_VERSINFO[0]}" -eq 4 ] && [ "${BASH_VERSINFO[1]}" -ge 2 ]; }; then + ts() { + local TZ=UTC + while read LINE; do + printf -v TS '%(%Y-%m-%d %H:%M:%S)T' -1 + echo "$TS $_PSI_J_JOB_ID $LINE" + done + } +else + ts() { + local TZ=UTC + while read LINE; do + TS=$(date '+%Y-%m-%d %H:%M:%S') + echo "$TS $_PSI_J_JOB_ID $LINE" + done + } +fi log() { echo "$@" >&3 diff --git a/src/psij/launchers/scripts/mpi_launch.sh b/src/psij/launchers/scripts/mpi_launch.sh index b23222db..445cb852 100644 --- a/src/psij/launchers/scripts/mpi_launch.sh +++ b/src/psij/launchers/scripts/mpi_launch.sh @@ -1,6 +1,6 @@ #!/bin/bash -source $(dirname "$0")/launcher_lib.sh +source "${0%/*}/launcher_lib.sh" _PSI_J_PROCESS_COUNT="$1" shift @@ -27,13 +27,13 @@ filter_out_5() { set +e if [ "$IS_OPENMPI_5" == "1" ]; then - mpirun --oversubscribe --output TAG -n $_PSI_J_PROCESS_COUNT "$@" \ - 1> >(filter_out_5 > $_PSI_J_STDOUT) 2> >(filter_out_5 > $_PSI_J_STDERR) <$_PSI_J_STDIN + mpirun --oversubscribe --output TAG -n "$_PSI_J_PROCESS_COUNT" "$@" \ + 1> >(filter_out_5 > "$_PSI_J_STDOUT") 2> >(filter_out_5 > "$_PSI_J_STDERR") <"$_PSI_J_STDIN" elif [ "$IS_OPENMPI" == "1" ]; then - mpirun --oversubscribe --tag-output -q -n $_PSI_J_PROCESS_COUNT "$@" \ - 1> >(filter_out > "$_PSI_J_STDOUT") 2> >(filter_out > $_PSI_J_STDERR) <$_PSI_J_STDIN + mpirun --oversubscribe --tag-output -q -n "$_PSI_J_PROCESS_COUNT" "$@" \ + 1> >(filter_out > "$_PSI_J_STDOUT") 2> >(filter_out > "$_PSI_J_STDERR") <"$_PSI_J_STDIN" else - mpirun -n $_PSI_J_PROCESS_COUNT "$@" 1>$_PSI_J_STDOUT 2>$_PSI_J_STDERR <$_PSI_J_STDIN + mpirun -n "$_PSI_J_PROCESS_COUNT" "$@" 1>"$_PSI_J_STDOUT" 2>"$_PSI_J_STDERR" <"$_PSI_J_STDIN" fi _PSI_J_EC=$? set -e @@ -42,4 +42,4 @@ log "Command done: $_PSI_J_EC" post_launch -exit $_PSI_J_EC +exit "$_PSI_J_EC" diff --git a/src/psij/launchers/scripts/multi_launch.sh b/src/psij/launchers/scripts/multi_launch.sh index 2c9f3213..e2f0664d 100644 --- a/src/psij/launchers/scripts/multi_launch.sh +++ b/src/psij/launchers/scripts/multi_launch.sh @@ -1,6 +1,6 @@ #!/bin/bash -source $(dirname "$0")/launcher_lib.sh +source "${0%/*}/launcher_lib.sh" pre_launch @@ -9,8 +9,8 @@ _PSI_J_PROCESS_COUNT="$1" shift export _PSI_J_PROCESS_COUNT -for INDEX in $(seq 1 1 $_PSI_J_PROCESS_COUNT); do - _PSI_J_PROCESS_INDEX_=$INDEX "$@" 1>>$_PSI_J_STDOUT 2>>$_PSI_J_STDERR <$_PSI_J_STDIN & +for INDEX in $(seq 1 1 "$_PSI_J_PROCESS_COUNT"); do + _PSI_J_PROCESS_INDEX_=$INDEX "$@" 1>>"$_PSI_J_STDOUT" 2>>"$_PSI_J_STDERR" <"$_PSI_J_STDIN" & PIDS="$PIDS $!" done diff --git a/src/psij/launchers/scripts/single_launch.sh b/src/psij/launchers/scripts/single_launch.sh index 88e5d235..52558671 100644 --- a/src/psij/launchers/scripts/single_launch.sh +++ b/src/psij/launchers/scripts/single_launch.sh @@ -1,11 +1,11 @@ #!/bin/bash -source $(dirname "$0")/launcher_lib.sh +source "${0%/*}/launcher_lib.sh" pre_launch set +e -"$@" 1>$_PSI_J_STDOUT 2>$_PSI_J_STDERR <$_PSI_J_STDIN +"$@" 1>"$_PSI_J_STDOUT" 2>"$_PSI_J_STDERR" <"$_PSI_J_STDIN" _PSI_J_EC=$? set -e log "Command done: $_PSI_J_EC" diff --git a/src/psij/launchers/scripts/srun_launch.sh b/src/psij/launchers/scripts/srun_launch.sh index d0ac39ca..3fcb0f4e 100644 --- a/src/psij/launchers/scripts/srun_launch.sh +++ b/src/psij/launchers/scripts/srun_launch.sh @@ -1,6 +1,6 @@ #!/bin/bash -source $(dirname "$0")/launcher_lib.sh +source "${0%/*}/launcher_lib.sh" _PSI_J_PROCESS_COUNT="$1" shift @@ -8,7 +8,7 @@ shift pre_launch set +e -srun "$@" 1>$_PSI_J_STDOUT 2>$_PSI_J_STDERR <$_PSI_J_STDIN +srun "$@" 1>"$_PSI_J_STDOUT" 2>"$_PSI_J_STDERR" <"$_PSI_J_STDIN" _PSI_J_EC=$? set -e diff --git a/tests/plugins1/_batch_test/test/launcher.sh b/tests/plugins1/_batch_test/test/launcher.sh index 13a188ed..bba3dfbd 100644 --- a/tests/plugins1/_batch_test/test/launcher.sh +++ b/tests/plugins1/_batch_test/test/launcher.sh @@ -1,6 +1,6 @@ #!/bin/bash -source $(dirname "$0")/launcher_lib.sh +source "${0%/*}/launcher_lib.sh" pre_launch @@ -18,20 +18,20 @@ export _PSI_J_PPN EXECUTABLE="$1" shift if [ "$EXECUTABLE" == "/bin/hostname" ]; then - EXECUTABLE=$(dirname "$0")/hostname + EXECUTABLE="${0%/*}/hostname" fi log "Running stuff" -log "STDOUT: $_PSI_J_STDOUT" -log "STDERR: $_PSI_J_STDERR" +log "STDOUT: \"$_PSI_J_STDOUT\"" +log "STDERR: \"$_PSI_J_STDERR\"" -for NODE in $(seq 1 1 $_PSI_J_NODE_COUNT); do +for NODE in $(seq 1 1 "$_PSI_J_NODE_COUNT"); do log "Node: $NODE" - for NODE_PROC in $(seq 1 1 $_PSI_J_PPN); do + for NODE_PROC in $(seq 1 1 "$_PSI_J_PPN"); do log "Node proc: $NODE_PROC" INDEX=$(($NODE * $_PSI_J_PPN + $NODE_PROC)) log "Index: $INDEX" - _PSI_J_NODE_INDEX_=$NODE _PSI_J_PROCESS_INDEX_=$INDEX "$EXECUTABLE" "$@" 1>>$_PSI_J_STDOUT 2>>$_PSI_J_STDERR <$_PSI_J_STDIN & + _PSI_J_NODE_INDEX_=$NODE _PSI_J_PROCESS_INDEX_=$INDEX "$EXECUTABLE" "$@" 1>>"$_PSI_J_STDOUT" 2>>"$_PSI_J_STDERR" <"$_PSI_J_STDIN" & PIDS="$PIDS $!" done done diff --git a/tests/test_nodefile.sh b/tests/test_nodefile.sh index f061d5ee..4eed9f47 100755 --- a/tests/test_nodefile.sh +++ b/tests/test_nodefile.sh @@ -8,7 +8,7 @@ if [ "$EXPECTED_N_NODES" == "" ]; then exit 3 fi -ACTUAL_N_NODES=`cat "$PSIJ_NODEFILE" | wc -l` +ACTUAL_N_NODES=$(wc -l < "$PSIJ_NODEFILE" | tr -d ' ') if [ "$EXPECTED_N_NODES" != "$ACTUAL_N_NODES" ]; then echo "Invalid node file. Expected $EXPECTED_N_NODES nodes, but got $ACTUAL_N_NODES."