2012-03-08 3 views
4

xp_cmdshell을 사용하여 중단 문제가 있습니다.호출 된 exe가 종료 된 후 xp_cmdshell이 ​​응답하지 않습니다.

  1. 실행 파일이 호출되어 작업을 수행하고 종료합니다. exe에서 ui 프롬프트로 인해 걸려 있지 않습니다. exe는 전혀 걸려 있지 않습니다. exe가 작업 관리자의 프로세스 목록에서 사라지고 EXE의 내부 로깅이 주 함수의 마지막 줄을 실행했음을 확인합니다.

  2. xp_cmdshell을 호출해도 SQL에서 제어가 반환되지 않습니다. 해당 줄에 멈 춥니 다 (배치의 마지막 줄입니다). 과정을 죽이는 것은 효과가 없습니다. 중단 된 프로세스를 제거하기 위해 실제로 SQL Server를 다시 시작해야합니다.

  3. 중단은 처음 실행할 때만 발생합니다. 동일한 매개 변수를 갖는 프로 시저에 대한 후속 호출은 첫 번째 매개 변수가 작동하는 한 올바르게 작동하고 종료됩니다. SQL이 다시 시작되면 첫 번째 후속 호출이 다시 중단됩니다.

  4. 그것은 어떤 차이가있는 경우

    , 나는 EXE에서 반환 값을 받기 위해 노력하고 있어요 - 내 SQL 절차가 끝납니다 :

    간부 @i = xp_cmdshell을 @cmd; return @i;

  5. 활동 모니터 과정을보고하는 PREEMPTIVE_OS_PROCESSOPS (어떤 다른 개발자 톱) 또는 PREEMPTIVE_OS_PIPEOPS (내 현재 테스트를보고 있어요 무엇을)

모든 아이디어의 대기 유형에 붙어있다?

+0

'@ i'로 귀찮게하지 않으면 어떻게됩니까? 그냥'exec xp_cmdshell @cmd;'? –

+0

시도하지 않았습니다. SQL Server를 다시 시작할 수있는 창을 기다려야합니다. 이 단일 프로세스를 죽이는 방법에 대한 아이디어가 있으므로 과감한 조치를 취할 필요가 없습니다. – Clyde

답변

0

실제로 우리는 실제로 결국 문제를 파악했습니다. 호출되는 앱은 특정 조건이 발생했을 때 일부 문서를 프린터에 자동으로 덤프하는 데 사용되었습니다.

특정 인쇄 드라이버가 인쇄 작업의 알림 트레이에 이상한 작은 창이 나타났습니다.그래서 ui 창이 나타나기 때문에 매달려있었습니다.하지만 우리의 앱은 우리 창문이 아니기 때문에 제대로 종료되었습니다. 프린트 드라이버에 의해 트리거 된 창이었습니다.

해당 드라이버에는 해당 디스플레이 창을 끌 수있는 옵션이 포함되어 있습니다. 옵션이 설정되면 문제가 사라졌습니다.

2

SQL Server 2008에서 xp_cmdshell 및 BCP와 관련된 호출과 동일한 문제가 발생했습니다. SQL 프로세스 ID를 죽이면 도움이되지 않습니다. "KILLED/ROLLBACK"상태에 머물러 있습니다.

Windows 작업 관리자에서 bcp.exe 프로세스를 종료하는 방법 만 죽일 수 있습니다.

결국 우리는 xp_cmdshell을 호출하는 sproc에서 잘못된 SQL 문제를 추적했습니다. 실수로 여러 트랜잭션을 루프에서 열고 닫지 않았습니다. BEGIN/COMMIT 트랜스 문제가 수정 된 후 PREEMPTIVE_OS_PROCESSOPS가 다시 돌아 오지 않았습니다.

4

xp_cmdshell을 통해 잘못된 주석을 실행 한 상황이 발생했습니다.

나는 SQL을 다시 시작하지 않고 그것을 죽일 수 있었다. 내가 한 일은 명령을 실행하는 프로세스를 식별하고 작업 관리자에서이를 제거하는 것이었다.

SQL이 Windows 2008에서 위쪽으로 실행 중이라고 가정하십시오. 작업 관리자, 프로세스 탭에서. 각 프로세스의 명령 줄을 표시하도록 열을 활성화했습니다 (예 :보기 -> 열 선택 ..).

xp_cmdshell을 통해 실행 한 명령이 확실하지 않은 경우 dbcc inputbuffer (SPID)는 실마리를 제공해야합니다.