It's all about the answers!

Ask a question

RTC-SCM-CLI: what is the right way to launch lscm.bat from a C#.NET wrapper tool (running in windows)

Karthikeyan Baskaran (45813) | asked Oct 29 '13, 1:15 a.m.
retagged Dec 13 '13, 11:20 a.m. by David Lafreniere (4.8k7)
I'm building a wrapper tool (C# .net) around the RTC SCM CLI
This wrapper tool is a GUI application with some set of menu commands like "Login to RTC", "Load Component" etc., This wrapper tool internally calls lscm.bat (from RTC-scmTools-Win-4.0.3 installation)

On click of every menu command (RTC specific), the wrapper tool launches "lscm.bat" in a new process with appropriate CLI arguments for that command. Find below the C# code:
            ProcessStartInfo processStartInfo = new ProcessStartInfo(BatchFilePath, CmdLine);
            processStartInfo.CreateNoWindow = true;
            processStartInfo.UseShellExecute = false;
            processStartInfo.RedirectStandardOutput = true;
            processStartInfo.RedirectStandardError = true;
            System.Diagnostics.Process process = System.Diagnostics.Process.Start(processStartInfo);
            StreamReader StdOutReader = process.StandardOutput;
            StreamReader StdErrReader = process.StandardError;           
            string StdOutMessage = StdOutReader.ReadToEnd();
            string StdErrMessage = StdErrReader.ReadToEnd();
            int ExitCode = process.ExitCode;

As shown in the code above, the wrapper tool captures the STDOUT and STDERR streams of lscm.bat for its own processing and display.

1. The wrapper tool with the above code was working fine for the below commands
- login
- list components
- create changeset
- checkin
- logout

2. Then, I executed the command
load -r <server> -d <RootDir> -f <workspace> <ComponentName>
=> I waited for about 10 mins, but the command did not return at all.
It looked like the command was hanging. So I opened Task manager and killed "scm.exe". Now the command returned immediately.

3. I closed the wrapper tool. Restarted it. And now, every RTC SCM CLI command that I'm executing (eg, login command) doesn't return at all. If I explicitly kill the scm.exe then the command returns immediately.

1. For every command triggered by the user in the wrapper tool, it is launching the lscm.bat in a separate process. Is this the right way to launch the lscm.bat ? Or is there a better approach available ?
2. What could be the reason behind the scm cli commands not returning ? (Please note that if I launch scm.exe instead of lscm.bat, then this issue doesn't occur)
3. Can you share some documentation on how this lscm.bat/scm.exe/fec.exe work together internally ? (I'm reading that lscm.bat will start scm.exe as a daemon but I couldn't find anything in windows services list. I could only find scm.exe running as a process in Task manager.)

Thanks for your help in advance.

One answer

permanent link
Shashikant Padur (4.2k27) | answered Dec 11 '13, 5:14 a.m.
edited Dec 11 '13, 5:15 a.m.
For 1) and 2) refer to
3) The daemon is being launched as a background process and not as a windows service.

Karthikeyan Baskaran commented Dec 12 '13, 12:46 a.m.
  1. Does it mean the below steps for me ?
  2. Execute scm.exe with start daemon command
         - Execute lscm.bat with login command
         - Execute lscm.bat with load command
         - ......
         - Execute lscm.bat with logout command
  3. Execute scm.exe with stop daemon command

  4. What happens if I mix up the sandbox specific and non-sandbox specific lscm.bat calls in between my login & logout commands above ? As you have mentioned in the other post, it will launch another scm.exe right ? In that case, will lscm.bat hang again ?

Shashikant Padur commented Dec 12 '13, 12:56 a.m.

 1. That sounds right but you may want to validate if there isn't a running daemon before you start a daemon.

2. If you run the remote (non-sandbox) calls from the same sandbox location then it will not launch a new daemon. But if run from different path, then yes, it will launch a new daemon.

Your answer

Register or to post your answer.