La macro killsess aborda una de las frustraciones más comunes en entornos Windows compartidos (como Citrix o Escritorio Remoto): la sesión de SAS bloqueada o "congelada" que impide iniciar una nueva o consume recursos inútilmente. Al aprovechar la utilidad nativa de Windows taskkill, este script permite al usuario limpiar su propio espacio de trabajo sin necesidad de contactar con soporte técnico, manteniendo protocolos de seguridad críticos.
Recomendaciones y puntos clave
Seguridad del PID (Process ID): El uso de la variable macro automática &sysjobid es magistral. Al incluir el filtro /fi "PID ne &sysjobid", la macro evita "suicidarse" al intentar cerrar la propia sesión que está ejecutando el comando. Esto permite que el proceso de limpieza finalice correctamente y registre los resultados en el log.
Precisión en el filtrado: El filtrado combinado por USERNAME y WINDOWTITLE establece una red de seguridad de múltiples capas. Garantiza que no cierres accidentalmente la sesión de un compañero ni tampoco una instancia propia de SAS (por ejemplo, la "Sesión 2") que podría estar realizando un cálculo crítico en segundo plano.
Requisitos de administración: Como cualquier llamada al shell del sistema mediante la instrucción X, esta macro requiere que la opción de sistema XCMD esté habilitada. Además, al ser taskkill un ejecutable específico de Windows, esta macro fallará en entornos basados en Linux o SAS Viya, donde debería adaptarse usando comandos como kill o pgrep.
Type : CREATION_INTERNE
El script no utiliza datos externos ni tablas SAS. Se basa completamente en la ejecución de comandos del sistema (CMD) a través de la instrucción X.
| 1 | %macro killsess(sessno); |
| 2 | %local err; |
| 3 | %let err=ERR%str(OR); |
| 4 | |
| 5 | %IF not %LENGTH(&sessno) %THEN %let sessno=1; |
| 6 | %ELSE %IF %LENGTH(%sysfunc(compress(&sessno,1234567890))) %THEN %DO; |
| 7 | %put &err: (killsess) You must specify an integer for the SESSION number sessno=&sessno; |
| 8 | %goto exit; |
| 9 | %END; |
| 1 | x taskkill /f /fi "USERNAME eq &sysuserid" /fi "PID ne &sysjobid" /fi "WINDOWTITLE eq SAS |
| 2 | Session &sessno.*"; |
| 3 |
| 1 | %goto skip; |
| 2 | %exit: %put &err: (killsess) Leaving macro due to problem(s) listed; |
| 3 | %skip: |
| 4 | %mend killsess; |