2016-05-13 263 views

回答

2
lsfError="**ERROR: Local jobs disabled. Please run through LSF only --" 
lsfExit=2 
lsfLog="$(getent passwd $(id -un) | cut -d: -f6)/.lsbatch/.lsf_${LSB_JOBID}.log" 
echo "**INFO: Verifying as LSF job ..." 
sleep 2s 
if [ -z "$LSB_JOBID" ]; then 
    echo "$lsfError"; exit $lsfExit 
elif [[ "$(bjobs $LSB_JOBID 2>&1)" =~ "not found" ]]; then 
    echo "**ERROR: Job $LSB_JOBID doesn't exist" > $lsfLog 
    echo "$lsfError"; exit $lsfExit 
elif [[ "$(bjobs -o 'command' -noheader $LSB_JOBID 2>&1)" != "$0" ]]; then 
    echo "**ERROR: Command not matched $(bjobs -o "command" -noheader $LSB_JOBID 2>&1) != $0" > $lsfLog 
    echo "$lsfError"; exit $lsfExit 
fi 
0

LSF將設置在作業環境中的一些環境變量,如$LSB_JOBID執行。您可以編寫腳本來檢查是否定義了此環境變量。如果不是,請解釋腳本只能作爲LSF作業運行,然後退出。

+0

我能抽到作業ID。什麼是LSF將設置的其他環境變量?是否有這些變量的任何文檔 –

+0

您可以在此找到完整列表(https://www.ibm.com/support/knowledgecenter/SSETD4_9.1.3/lsf_config_ref/lsf_envars_job_exec。 dita?lang = en) –

+0

但是用戶仍然可以在自己的終端上設置這些變量並執行腳本而不用作爲bjob啓動。腳本無法確定這些變量是來自LSF還是從終端 –

0

我猜你可能預期的LSF工作由res開始,這樣你就可以檢查是否有同一進程羣在res過程中,像

_pgid=`ps -o pgid --no-headers -p $$` 
ps -o comm,pgid --no-headers | grep -qE '^res\s+'${_pgid// /}'$' || { echo "Must submit as LSF job!"; exit 1; } 
+0

繼承我已將-u $(id -un)添加到ps命令。當不是lsf時它退出。 但是如果每個bjob都有res的過程,我們如何才能確定哪個res屬於哪個bjob –

+0

我想你可以使用作業的進程組來標識與這個特定作業相關的'res'實例;請參閱編輯。 – mustaccio