2010-02-09 03:25:34 +08:00
|
|
|
MODULE set_signal
|
|
|
|
! This module is a Fortran 2003 interface to the customize_signals.c C file
|
|
|
|
! Compatible with Intel/PGI/Gcc(>=4.3) compilers
|
|
|
|
|
2010-02-26 03:51:34 +08:00
|
|
|
! This module is compiled only if the following preprocessing option
|
|
|
|
! is enabled
|
Added the possibility to intercept several signal and trigger a proper stop of the code, as if the file prefix.EXIT was found.
Currently intercepted signals are SIGINT (caused by CTRL-C), SIGTERM (by default sent by PBS one minute before wall time expires), SIGUSR1, SIGUSR2
In order to compile this code add -D__TERMINATE_GRACEFULLY to MANUAL_DFLAGS in make.sys
This code partially conflicts with __TRAP_SIGUSR1, although they can both be compiled ony the last signal handler set will work. However they do the same thing, so __TRAP_SIGUSR1 could eventually be removed as it is less general.
You can change the delay between the alert and the end of allocated wall time depending on the queue system. Here are some examples:
* with PBS:
send the signal 120 seconds before the end:
#PBS -l signal=@120
send signal SIGUSR1 10 minutes before the end:
#PBS -l signal=SIGUSR1@600
you cand also send a signal manually with qsig, or send a signal and then stop:
qdel -W 120 jobid
will send SIGTERM, wait 2 minutes than force stop.
* with LodLeveler:
According to documentation, a SIGUSR1 or a SIGTERM is sent, depending if the job will be restarted or not; SIGKILL follows after 2 minutes. There is no mention if this delay can be changed.
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@11024 c92efa57-630b-4861-b058-cf58834340f0
2014-06-04 22:12:13 +08:00
|
|
|
#if defined(__TRAP_SIGUSR1) || defined(__TERMINATE_GRACEFULLY)
|
2010-02-09 03:25:34 +08:00
|
|
|
|
|
|
|
USE iso_c_binding
|
|
|
|
USE io_global, ONLY : stdout
|
2013-10-07 16:10:00 +08:00
|
|
|
USE mp_world, ONLY : root, world_comm, mpime
|
|
|
|
USE mp, ONLY : mp_bcast
|
2010-02-09 03:25:34 +08:00
|
|
|
|
|
|
|
IMPLICIT NONE
|
|
|
|
|
|
|
|
LOGICAL,VOLATILE::signal_trapped
|
Added the possibility to intercept several signal and trigger a proper stop of the code, as if the file prefix.EXIT was found.
Currently intercepted signals are SIGINT (caused by CTRL-C), SIGTERM (by default sent by PBS one minute before wall time expires), SIGUSR1, SIGUSR2
In order to compile this code add -D__TERMINATE_GRACEFULLY to MANUAL_DFLAGS in make.sys
This code partially conflicts with __TRAP_SIGUSR1, although they can both be compiled ony the last signal handler set will work. However they do the same thing, so __TRAP_SIGUSR1 could eventually be removed as it is less general.
You can change the delay between the alert and the end of allocated wall time depending on the queue system. Here are some examples:
* with PBS:
send the signal 120 seconds before the end:
#PBS -l signal=@120
send signal SIGUSR1 10 minutes before the end:
#PBS -l signal=SIGUSR1@600
you cand also send a signal manually with qsig, or send a signal and then stop:
qdel -W 120 jobid
will send SIGTERM, wait 2 minutes than force stop.
* with LodLeveler:
According to documentation, a SIGUSR1 or a SIGTERM is sent, depending if the job will be restarted or not; SIGKILL follows after 2 minutes. There is no mention if this delay can be changed.
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@11024 c92efa57-630b-4861-b058-cf58834340f0
2014-06-04 22:12:13 +08:00
|
|
|
INTEGER(kind=c_int),PARAMETER :: SIGINT = 2_c_int
|
2010-02-09 03:25:34 +08:00
|
|
|
|
|
|
|
INTERFACE
|
|
|
|
FUNCTION init_signal_USR1(new_handler) BIND(c, name = "init_signal_USR1")
|
|
|
|
USE iso_c_binding
|
|
|
|
TYPE(C_FUNPTR),VALUE,INTENT(IN):: new_handler
|
|
|
|
INTEGER(C_INT)::init_signal_USR1
|
|
|
|
END FUNCTION init_signal_USR1
|
|
|
|
|
Added the possibility to intercept several signal and trigger a proper stop of the code, as if the file prefix.EXIT was found.
Currently intercepted signals are SIGINT (caused by CTRL-C), SIGTERM (by default sent by PBS one minute before wall time expires), SIGUSR1, SIGUSR2
In order to compile this code add -D__TERMINATE_GRACEFULLY to MANUAL_DFLAGS in make.sys
This code partially conflicts with __TRAP_SIGUSR1, although they can both be compiled ony the last signal handler set will work. However they do the same thing, so __TRAP_SIGUSR1 could eventually be removed as it is less general.
You can change the delay between the alert and the end of allocated wall time depending on the queue system. Here are some examples:
* with PBS:
send the signal 120 seconds before the end:
#PBS -l signal=@120
send signal SIGUSR1 10 minutes before the end:
#PBS -l signal=SIGUSR1@600
you cand also send a signal manually with qsig, or send a signal and then stop:
qdel -W 120 jobid
will send SIGTERM, wait 2 minutes than force stop.
* with LodLeveler:
According to documentation, a SIGUSR1 or a SIGTERM is sent, depending if the job will be restarted or not; SIGKILL follows after 2 minutes. There is no mention if this delay can be changed.
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@11024 c92efa57-630b-4861-b058-cf58834340f0
2014-06-04 22:12:13 +08:00
|
|
|
FUNCTION init_TERMINATE_GRACEFULLY(new_handler) BIND(c, name = "init_TERMINATE_GRACEFULLY")
|
|
|
|
USE iso_c_binding
|
|
|
|
TYPE(C_FUNPTR),VALUE,INTENT(IN):: new_handler
|
|
|
|
INTEGER(C_INT)::init_TERMINATE_GRACEFULLY
|
|
|
|
END FUNCTION init_TERMINATE_GRACEFULLY
|
|
|
|
|
2010-02-09 03:25:34 +08:00
|
|
|
FUNCTION init_signal(signum, new_handler) BIND(c, name = "init_signal")
|
|
|
|
USE iso_c_binding
|
|
|
|
INTEGER(C_INT),VALUE :: signum
|
2010-02-26 03:51:34 +08:00
|
|
|
TYPE(C_FUNPTR), VALUE,INTENT(IN) :: new_handler
|
2010-02-09 03:25:34 +08:00
|
|
|
INTEGER(C_INT)::init_signal
|
|
|
|
END FUNCTION init_signal
|
|
|
|
|
|
|
|
END INTERFACE
|
|
|
|
|
|
|
|
CONTAINS
|
|
|
|
|
Added the possibility to intercept several signal and trigger a proper stop of the code, as if the file prefix.EXIT was found.
Currently intercepted signals are SIGINT (caused by CTRL-C), SIGTERM (by default sent by PBS one minute before wall time expires), SIGUSR1, SIGUSR2
In order to compile this code add -D__TERMINATE_GRACEFULLY to MANUAL_DFLAGS in make.sys
This code partially conflicts with __TRAP_SIGUSR1, although they can both be compiled ony the last signal handler set will work. However they do the same thing, so __TRAP_SIGUSR1 could eventually be removed as it is less general.
You can change the delay between the alert and the end of allocated wall time depending on the queue system. Here are some examples:
* with PBS:
send the signal 120 seconds before the end:
#PBS -l signal=@120
send signal SIGUSR1 10 minutes before the end:
#PBS -l signal=SIGUSR1@600
you cand also send a signal manually with qsig, or send a signal and then stop:
qdel -W 120 jobid
will send SIGTERM, wait 2 minutes than force stop.
* with LodLeveler:
According to documentation, a SIGUSR1 or a SIGTERM is sent, depending if the job will be restarted or not; SIGKILL follows after 2 minutes. There is no mention if this delay can be changed.
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@11024 c92efa57-630b-4861-b058-cf58834340f0
2014-06-04 22:12:13 +08:00
|
|
|
#ifdef __TRAP_SIGUSR1
|
2010-02-09 03:25:34 +08:00
|
|
|
SUBROUTINE set_signal_USR1(routine)
|
|
|
|
USE iso_c_binding
|
|
|
|
TYPE(C_FUNPTR),TARGET::ptr
|
|
|
|
INTERFACE
|
|
|
|
SUBROUTINE routine(signal) bind(C)
|
|
|
|
USE iso_c_binding
|
|
|
|
INTEGER(C_INT),VALUE, INTENT(IN)::signal
|
|
|
|
END SUBROUTINE routine
|
|
|
|
|
|
|
|
END INTERFACE
|
|
|
|
|
|
|
|
ptr = C_FUNLOC(routine)
|
|
|
|
|
|
|
|
IF (init_signal_USR1(ptr) .NE. 0) THEN
|
|
|
|
CALL errore("set_signal_USR1", "The association of signal USR1 failed!", 1)
|
|
|
|
ENDIF
|
|
|
|
|
|
|
|
END SUBROUTINE set_signal_USR1
|
Added the possibility to intercept several signal and trigger a proper stop of the code, as if the file prefix.EXIT was found.
Currently intercepted signals are SIGINT (caused by CTRL-C), SIGTERM (by default sent by PBS one minute before wall time expires), SIGUSR1, SIGUSR2
In order to compile this code add -D__TERMINATE_GRACEFULLY to MANUAL_DFLAGS in make.sys
This code partially conflicts with __TRAP_SIGUSR1, although they can both be compiled ony the last signal handler set will work. However they do the same thing, so __TRAP_SIGUSR1 could eventually be removed as it is less general.
You can change the delay between the alert and the end of allocated wall time depending on the queue system. Here are some examples:
* with PBS:
send the signal 120 seconds before the end:
#PBS -l signal=@120
send signal SIGUSR1 10 minutes before the end:
#PBS -l signal=SIGUSR1@600
you cand also send a signal manually with qsig, or send a signal and then stop:
qdel -W 120 jobid
will send SIGTERM, wait 2 minutes than force stop.
* with LodLeveler:
According to documentation, a SIGUSR1 or a SIGTERM is sent, depending if the job will be restarted or not; SIGKILL follows after 2 minutes. There is no mention if this delay can be changed.
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@11024 c92efa57-630b-4861-b058-cf58834340f0
2014-06-04 22:12:13 +08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef __TERMINATE_GRACEFULLY
|
|
|
|
SUBROUTINE set_TERMINATE_GRACEFULLY(routine)
|
|
|
|
USE iso_c_binding
|
|
|
|
TYPE(C_FUNPTR),TARGET::ptr
|
|
|
|
INTERFACE
|
|
|
|
SUBROUTINE routine(signal) bind(C)
|
|
|
|
USE iso_c_binding
|
|
|
|
INTEGER(C_INT),VALUE, INTENT(IN)::signal
|
|
|
|
END SUBROUTINE routine
|
|
|
|
|
|
|
|
END INTERFACE
|
|
|
|
|
|
|
|
ptr = C_FUNLOC(routine)
|
|
|
|
|
|
|
|
IF (init_TERMINATE_GRACEFULLY(ptr) .NE. 0) THEN
|
|
|
|
CALL errore("set_TERMINATE_GRACEFULLY", "The association of signals INT or TERM failed!", 1)
|
|
|
|
ENDIF
|
|
|
|
|
|
|
|
END SUBROUTINE set_TERMINATE_GRACEFULLY
|
|
|
|
#endif
|
2010-02-09 03:25:34 +08:00
|
|
|
|
|
|
|
! Unused. Here for possible future developments
|
|
|
|
SUBROUTINE set_signal_action(signal, routine)
|
|
|
|
USE iso_c_binding
|
|
|
|
INTEGER::signal
|
|
|
|
TYPE(C_FUNPTR),TARGET::ptr
|
|
|
|
INTERFACE
|
|
|
|
SUBROUTINE routine(signal) bind(C)
|
|
|
|
USE iso_c_binding
|
|
|
|
INTEGER(C_INT),VALUE::signal
|
|
|
|
END SUBROUTINE routine
|
|
|
|
END INTERFACE
|
|
|
|
|
|
|
|
ptr = C_FUNLOC(routine)
|
|
|
|
|
|
|
|
IF (init_signal(signal, ptr) .NE. 0) THEN
|
|
|
|
CALL errore("set_signal", "The association of the signal failed!", 1)
|
|
|
|
ENDIF
|
|
|
|
END SUBROUTINE set_signal_action
|
|
|
|
|
|
|
|
|
|
|
|
! Sets the signal_trapped flag on all nodes/processors
|
|
|
|
! Only the master will use the signal, though
|
|
|
|
SUBROUTINE custom_handler(signum) BIND(c)
|
|
|
|
USE iso_c_binding
|
Added the possibility to intercept several signal and trigger a proper stop of the code, as if the file prefix.EXIT was found.
Currently intercepted signals are SIGINT (caused by CTRL-C), SIGTERM (by default sent by PBS one minute before wall time expires), SIGUSR1, SIGUSR2
In order to compile this code add -D__TERMINATE_GRACEFULLY to MANUAL_DFLAGS in make.sys
This code partially conflicts with __TRAP_SIGUSR1, although they can both be compiled ony the last signal handler set will work. However they do the same thing, so __TRAP_SIGUSR1 could eventually be removed as it is less general.
You can change the delay between the alert and the end of allocated wall time depending on the queue system. Here are some examples:
* with PBS:
send the signal 120 seconds before the end:
#PBS -l signal=@120
send signal SIGUSR1 10 minutes before the end:
#PBS -l signal=SIGUSR1@600
you cand also send a signal manually with qsig, or send a signal and then stop:
qdel -W 120 jobid
will send SIGTERM, wait 2 minutes than force stop.
* with LodLeveler:
According to documentation, a SIGUSR1 or a SIGTERM is sent, depending if the job will be restarted or not; SIGKILL follows after 2 minutes. There is no mention if this delay can be changed.
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@11024 c92efa57-630b-4861-b058-cf58834340f0
2014-06-04 22:12:13 +08:00
|
|
|
#ifdef __MPI
|
|
|
|
USE mp_world, ONLY : world_comm
|
|
|
|
USE mp, ONLY : mp_abort
|
|
|
|
#endif
|
2010-02-26 03:51:34 +08:00
|
|
|
INTEGER(C_INT),VALUE,INTENT(IN):: signum
|
Added the possibility to intercept several signal and trigger a proper stop of the code, as if the file prefix.EXIT was found.
Currently intercepted signals are SIGINT (caused by CTRL-C), SIGTERM (by default sent by PBS one minute before wall time expires), SIGUSR1, SIGUSR2
In order to compile this code add -D__TERMINATE_GRACEFULLY to MANUAL_DFLAGS in make.sys
This code partially conflicts with __TRAP_SIGUSR1, although they can both be compiled ony the last signal handler set will work. However they do the same thing, so __TRAP_SIGUSR1 could eventually be removed as it is less general.
You can change the delay between the alert and the end of allocated wall time depending on the queue system. Here are some examples:
* with PBS:
send the signal 120 seconds before the end:
#PBS -l signal=@120
send signal SIGUSR1 10 minutes before the end:
#PBS -l signal=SIGUSR1@600
you cand also send a signal manually with qsig, or send a signal and then stop:
qdel -W 120 jobid
will send SIGTERM, wait 2 minutes than force stop.
* with LodLeveler:
According to documentation, a SIGUSR1 or a SIGTERM is sent, depending if the job will be restarted or not; SIGKILL follows after 2 minutes. There is no mention if this delay can be changed.
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@11024 c92efa57-630b-4861-b058-cf58834340f0
2014-06-04 22:12:13 +08:00
|
|
|
! Double CTRL-C will stop immediately;
|
|
|
|
! This cannot be done with any signal because some implementation of MPI
|
|
|
|
! send SIGTERM to every process when SIGINT (aka CTRL-C) is received
|
|
|
|
IF(signal_trapped.and.signum==SIGINT) THEN
|
|
|
|
WRITE(stdout, '(/,5x,a)') "**** SIGNAL ALREADY TRAPPED: terminating immediately!!", signum
|
|
|
|
#ifdef __MPI
|
|
|
|
CALL mp_abort(signum, world_comm)
|
|
|
|
#else
|
|
|
|
STOP 1
|
|
|
|
#endif
|
|
|
|
ELSE
|
|
|
|
WRITE(stdout, '(/,5x,a)') "**** Trapped signal: trying to terminate gracefully", signum
|
|
|
|
IF(signum==SIGINT) &
|
|
|
|
WRITE(stdout, '(5x,a)') "**** press CTRL-C again to terminate immediately (no restart possible!)", signum
|
|
|
|
!
|
|
|
|
signal_trapped = .TRUE.
|
|
|
|
ENDIF
|
|
|
|
!
|
2010-02-09 03:25:34 +08:00
|
|
|
END SUBROUTINE custom_handler
|
|
|
|
|
|
|
|
|
|
|
|
! Set the signal handler for SIGUSR1 to 'custom_handler'
|
|
|
|
! Every processor will trap the signal, howver only 0 will actually
|
Added the possibility to intercept several signal and trigger a proper stop of the code, as if the file prefix.EXIT was found.
Currently intercepted signals are SIGINT (caused by CTRL-C), SIGTERM (by default sent by PBS one minute before wall time expires), SIGUSR1, SIGUSR2
In order to compile this code add -D__TERMINATE_GRACEFULLY to MANUAL_DFLAGS in make.sys
This code partially conflicts with __TRAP_SIGUSR1, although they can both be compiled ony the last signal handler set will work. However they do the same thing, so __TRAP_SIGUSR1 could eventually be removed as it is less general.
You can change the delay between the alert and the end of allocated wall time depending on the queue system. Here are some examples:
* with PBS:
send the signal 120 seconds before the end:
#PBS -l signal=@120
send signal SIGUSR1 10 minutes before the end:
#PBS -l signal=SIGUSR1@600
you cand also send a signal manually with qsig, or send a signal and then stop:
qdel -W 120 jobid
will send SIGTERM, wait 2 minutes than force stop.
* with LodLeveler:
According to documentation, a SIGUSR1 or a SIGTERM is sent, depending if the job will be restarted or not; SIGKILL follows after 2 minutes. There is no mention if this delay can be changed.
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@11024 c92efa57-630b-4861-b058-cf58834340f0
2014-06-04 22:12:13 +08:00
|
|
|
! use the result (required since the default action for SIGUSR1 is exit)
|
2010-02-09 03:25:34 +08:00
|
|
|
SUBROUTINE signal_trap_init
|
|
|
|
USE iso_c_binding
|
Added the possibility to intercept several signal and trigger a proper stop of the code, as if the file prefix.EXIT was found.
Currently intercepted signals are SIGINT (caused by CTRL-C), SIGTERM (by default sent by PBS one minute before wall time expires), SIGUSR1, SIGUSR2
In order to compile this code add -D__TERMINATE_GRACEFULLY to MANUAL_DFLAGS in make.sys
This code partially conflicts with __TRAP_SIGUSR1, although they can both be compiled ony the last signal handler set will work. However they do the same thing, so __TRAP_SIGUSR1 could eventually be removed as it is less general.
You can change the delay between the alert and the end of allocated wall time depending on the queue system. Here are some examples:
* with PBS:
send the signal 120 seconds before the end:
#PBS -l signal=@120
send signal SIGUSR1 10 minutes before the end:
#PBS -l signal=SIGUSR1@600
you cand also send a signal manually with qsig, or send a signal and then stop:
qdel -W 120 jobid
will send SIGTERM, wait 2 minutes than force stop.
* with LodLeveler:
According to documentation, a SIGUSR1 or a SIGTERM is sent, depending if the job will be restarted or not; SIGKILL follows after 2 minutes. There is no mention if this delay can be changed.
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@11024 c92efa57-630b-4861-b058-cf58834340f0
2014-06-04 22:12:13 +08:00
|
|
|
#ifdef __TRAP_SIGUSR1
|
|
|
|
WRITE(stdout, FMT='(5x,a)') "signal trapping enabled: kill the code with -SIGUSR1 to stop cleanly the simulation "
|
2010-02-09 03:25:34 +08:00
|
|
|
CALL set_signal_USR1(custom_handler)
|
Added the possibility to intercept several signal and trigger a proper stop of the code, as if the file prefix.EXIT was found.
Currently intercepted signals are SIGINT (caused by CTRL-C), SIGTERM (by default sent by PBS one minute before wall time expires), SIGUSR1, SIGUSR2
In order to compile this code add -D__TERMINATE_GRACEFULLY to MANUAL_DFLAGS in make.sys
This code partially conflicts with __TRAP_SIGUSR1, although they can both be compiled ony the last signal handler set will work. However they do the same thing, so __TRAP_SIGUSR1 could eventually be removed as it is less general.
You can change the delay between the alert and the end of allocated wall time depending on the queue system. Here are some examples:
* with PBS:
send the signal 120 seconds before the end:
#PBS -l signal=@120
send signal SIGUSR1 10 minutes before the end:
#PBS -l signal=SIGUSR1@600
you cand also send a signal manually with qsig, or send a signal and then stop:
qdel -W 120 jobid
will send SIGTERM, wait 2 minutes than force stop.
* with LodLeveler:
According to documentation, a SIGUSR1 or a SIGTERM is sent, depending if the job will be restarted or not; SIGKILL follows after 2 minutes. There is no mention if this delay can be changed.
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@11024 c92efa57-630b-4861-b058-cf58834340f0
2014-06-04 22:12:13 +08:00
|
|
|
#endif
|
|
|
|
#ifdef __TERMINATE_GRACEFULLY
|
2014-06-04 22:23:19 +08:00
|
|
|
WRITE(stdout, FMT='(/,5x,a)') "Signal trapping enabled: code will terminate cleanly with SIGINT, SIGTERM, SIGUSR1, SIGUSR2, SIGXCPU"
|
Added the possibility to intercept several signal and trigger a proper stop of the code, as if the file prefix.EXIT was found.
Currently intercepted signals are SIGINT (caused by CTRL-C), SIGTERM (by default sent by PBS one minute before wall time expires), SIGUSR1, SIGUSR2
In order to compile this code add -D__TERMINATE_GRACEFULLY to MANUAL_DFLAGS in make.sys
This code partially conflicts with __TRAP_SIGUSR1, although they can both be compiled ony the last signal handler set will work. However they do the same thing, so __TRAP_SIGUSR1 could eventually be removed as it is less general.
You can change the delay between the alert and the end of allocated wall time depending on the queue system. Here are some examples:
* with PBS:
send the signal 120 seconds before the end:
#PBS -l signal=@120
send signal SIGUSR1 10 minutes before the end:
#PBS -l signal=SIGUSR1@600
you cand also send a signal manually with qsig, or send a signal and then stop:
qdel -W 120 jobid
will send SIGTERM, wait 2 minutes than force stop.
* with LodLeveler:
According to documentation, a SIGUSR1 or a SIGTERM is sent, depending if the job will be restarted or not; SIGKILL follows after 2 minutes. There is no mention if this delay can be changed.
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@11024 c92efa57-630b-4861-b058-cf58834340f0
2014-06-04 22:12:13 +08:00
|
|
|
WRITE(stdout, FMT='(5x,a)') "Type CTRL-C twice to terminate immediately (no restart possible!)"
|
|
|
|
CALL set_TERMINATE_GRACEFULLY(custom_handler)
|
|
|
|
#endif
|
2010-02-09 03:25:34 +08:00
|
|
|
END SUBROUTINE signal_trap_init
|
|
|
|
|
|
|
|
FUNCTION signal_detected()
|
|
|
|
LOGICAL::signal_detected
|
|
|
|
! If the signal is trapped, set the exit status and broadcast it
|
|
|
|
! DO NOT broadcast the signal_trapped variable or you will be Very
|
|
|
|
! Sorry
|
|
|
|
signal_detected = signal_trapped
|
|
|
|
|
|
|
|
CALL mp_bcast(signal_detected, root, world_comm)
|
|
|
|
|
|
|
|
END FUNCTION signal_detected
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
USE io_global, ONLY : stdout
|
|
|
|
|
|
|
|
CONTAINS
|
|
|
|
|
|
|
|
! Place holders to employ when the signal trapping feature is disabled
|
|
|
|
SUBROUTINE signal_trap_init
|
Added the possibility to intercept several signal and trigger a proper stop of the code, as if the file prefix.EXIT was found.
Currently intercepted signals are SIGINT (caused by CTRL-C), SIGTERM (by default sent by PBS one minute before wall time expires), SIGUSR1, SIGUSR2
In order to compile this code add -D__TERMINATE_GRACEFULLY to MANUAL_DFLAGS in make.sys
This code partially conflicts with __TRAP_SIGUSR1, although they can both be compiled ony the last signal handler set will work. However they do the same thing, so __TRAP_SIGUSR1 could eventually be removed as it is less general.
You can change the delay between the alert and the end of allocated wall time depending on the queue system. Here are some examples:
* with PBS:
send the signal 120 seconds before the end:
#PBS -l signal=@120
send signal SIGUSR1 10 minutes before the end:
#PBS -l signal=SIGUSR1@600
you cand also send a signal manually with qsig, or send a signal and then stop:
qdel -W 120 jobid
will send SIGTERM, wait 2 minutes than force stop.
* with LodLeveler:
According to documentation, a SIGUSR1 or a SIGTERM is sent, depending if the job will be restarted or not; SIGKILL follows after 2 minutes. There is no mention if this delay can be changed.
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@11024 c92efa57-630b-4861-b058-cf58834340f0
2014-06-04 22:12:13 +08:00
|
|
|
WRITE(stdout, FMT=*) "signal trapping disabled: compile with "
|
|
|
|
WRITE(stdout, FMT=*) "-D__TRAP_SIGUSR1 to enable this feature"
|
2010-02-09 03:25:34 +08:00
|
|
|
END SUBROUTINE signal_trap_init
|
|
|
|
|
|
|
|
FUNCTION signal_detected()
|
|
|
|
LOGICAL::signal_detected
|
|
|
|
signal_detected = .FALSE.
|
|
|
|
END FUNCTION signal_detected
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
END MODULE set_signal
|