Das Makro killsess ist ein unverzichtbares Werkzeug für Power-User in Windows-Umgebungen (wie Citrix oder Remote Desktop). Es löst das Problem von „Geistersitzungen“, die nicht mehr reagieren und Ressourcen blockieren. Durch die Nutzung des nativen Windows-Befehls taskkill ermöglicht es eine Selbsthilfe ohne IT-Support, während intelligente Filter kritische Fehlbedienungen verhindern.
Strategische Empfehlungen
Der PID-Sicherheitsmechanismus: Die Verwendung der automatischen Makrovariable &sysjobid ist entscheidend. Durch den Filter /fi "PID ne &sysjobid" wird verhindert, dass das Makro die aktuelle Sitzung „suizidiert“. Nur so kann der Prozess andere Instanzen sauber beenden und das Ergebnis noch im Log protokollieren.
Präzise Zielsteuerung: Die Kombination aus USERNAME und WINDOWTITLE stellt sicher, dass Sie nur Ihre eigenen Sitzungen beenden und nicht die eines Kollegen auf demselben Server. Zudem erlaubt die Variable &sessno, gezielt eine bestimmte Instanz (z. B. „Session 2“) zu terminieren, während andere produktive Sitzungen unberührt bleiben.
Administrative Voraussetzungen: Da das Makro den System-Shell-Befehl X nutzt, muss die Systemoption XCMD aktiviert sein. Beachten Sie, dass dieser Befehl Windows-spezifisch ist. In einer Linux-basierten Umgebung (wie SAS Viya) würde dieser Aufruf scheitern und müsste durch kill- oder pgrep-Befehle ersetzt werden.
Type : CREATION_INTERNE
Das Skript verwendet keine externen Daten oder SAS-Tabellen. Es basiert vollständig auf der Ausführung von Systembefehlen (CMD) über die X-Anweisung.
| 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; |