user8164: I'm trying to write a Linux command line UCI interface for Stockfish. My program writes a bunch of commands to a text file and then tries to pipe them to Stockfish via the command line. My problem is, whenever I try to analyse a position, the program exits almost immediately:
sf.txt:
position startpos moves e2e4
go movetime 5000

output:
~$ stockfish < sf.txt
Stockfish 261014 64 by Tord Romstad, Marco Costalba and Joona Kiiski
info nodes 0 time 2
bestmove a7a6 ponder (none)

As you can see, the program exits in 2 ms instead of waiting for the analysis to finish. Has anyone delt with this issue before? Is there a preferred way of interfacing with Stockfish?

user8689: The problem there is that stockfish process quits as soon as the input stream is closed. And that happens instantaneously, because the input stream is equivalent to a cat command. As a result, Stockfish never gets a chance to run the search tree. So Stockfish just outputs the very first move in it's list (which is a7a6 in your example).
The simple solution is to delay the input stream with a sleep until Stockfish is done with it's analysis. That can be done by using two commands to generate Stockfish's input stream. Example:
( cat sf.txt; sleep 5001; ) | stockfish

That works nice if you know the exact amount of time Stockfish will take, which is 5000 seconds in your example (notice I added 1 second just to be on the safe side).
However, when you are limiting the search by nodes or by depth (such as in go depth 30), you don't know how much time Stockfish will take. In such case, the trick above won't be optimal, as it will either interrupt too early or keep sleeping for too long. So, instead you can use a more elaborated solution, which includes sending Stockfish's output to a file and making the input process wait for the bestmove string to show up on that file:
(
    echo "setoption name Hash value 1024";
    echo "setoption name threads value 10";
    echo "position fen 'rn3rk1/pbppq1pp/1p2pb2/4N2Q/3PN3/3B4/PPP2PPP/R3K2R w KQ - 6 11'";
    echo "go depth 30";
    (grep -m 1 "bestmove" <(tail -f analysis.txt))> /dev/null
) | stockfish | tee /dev/stderr > analysis.txt

Yeah, it is literally catching it's own tail, but it does get to an end. :-)
Explanation:

tail -f watches the Stockfish's output file
grep -m 1 "bestmove" filters the watched file until that string is found, then quits
> /dev/null is to prevent grep's output to be resent to Stockfish
| tee /dev/stderr is optional, for you to see Stockfish's output in real time


user4362: Edit: I think the main problem is that the uci protocol is a dialog. You have to wait for the "readyok" output from the engine before you can issue another command. Probably you just cannot forcefeed all commands in one go.
To quote the uci protocol:
"* all command strings the engine receives will end with '\n', …"
Possibly you just forgot about that in your second line. 

user12273: look into python-chess package. It includes a protocol for interacting with engines.

user12867: Solution: Use 'expect' script as shown below. Tested with stockfish_8_x64_modern. 

BlindKungFuMaster: "I think the main problem is that the uci protocol is a dialog."
    I agree!

#!/usr/bin/expect

spawn ~/stockfish_8_x64_modern

expect -timeout 1000  Linscott 

send "setoption name Ponder  value false \r isready \r"

expect -timeout 1000  readyok

send "setoption name Hash    value 2048 \r isready \r"

expect -timeout 1000  readyok

send "setoption name Threads value 8    \r isready \r"

expect -timeout 1000  readyok

send "setoption name MultiPV value 4    \r isready \r"

expect -timeout 1000  readyok

set row8 "rnbqkbnr"

set row7 "pppppppp"

set row6 "11111111"

set row5 "11111111"

set row4 "11111111"

set row3 "11111111"

set row2 "PPPPPPPP"

set row1 "RNBQKBNR"


send "position fen $row8/$row7/$row6/$row5/$row4/$row3/$row2/$row1 w KQkq - 0 1 moves e2e4 \r isready \r"

expect -timeout 1000  readyok

send "go infinite \r" 

expect -timeout 999999  readyok


8164: <p>I'm trying to write a Linux command line UCI interface for Stockfish. My program writes a bunch of commands to a text file and then tries to pipe them to Stockfish via the command line. My problem is, whenever I try to analyse a position, the program exits almost immediately:</p>

<p>sf.txt:</p>

<pre><code>position startpos moves e2e4
go movetime 5000
</code></pre>

<p>output:</p>

<pre><code>~$ stockfish &lt; sf.txt
Stockfish 261014 64 by Tord Romstad, Marco Costalba and Joona Kiiski
info nodes 0 time 2
bestmove a7a6 ponder (none)
</code></pre>

<p>As you can see, the program exits in 2 ms instead of waiting for the analysis to finish. Has anyone delt with this issue before? Is there a preferred way of interfacing with Stockfish?</p>
 8689: <p>The problem there is that stockfish process quits as soon as the input stream is closed. And that happens instantaneously, because the input stream is equivalent to a <code>cat</code> command. As a result, Stockfish never gets a chance to run the search tree. So Stockfish just outputs the very first move in it's list (which is <code>a7a6</code> in your example).</p>
<p>The simple solution is to delay the input stream with a <code>sleep</code> until Stockfish is done with it's analysis. That can be done by using two commands to generate Stockfish's input stream. Example:</p>
<pre><code>( cat sf.txt; sleep 5001; ) | stockfish
</code></pre>
<p>That works nice if you know the exact amount of time Stockfish will take, which is 5000 seconds in your example (notice I added 1 second just to be on the safe side).</p>
<p>However, when you are limiting the search by nodes or by depth (such as in <code>go depth 30</code>), you don't know how much time Stockfish will take. In such case, the trick above won't be optimal, as it will either interrupt too early or keep sleeping for too long. So, instead you can use a more elaborated solution, which includes sending Stockfish's output to a file and making the input process wait for the <code>bestmove</code> string to show up on that file:</p>
<pre><code>(
    echo &quot;setoption name Hash value 1024&quot;;
    echo &quot;setoption name threads value 10&quot;;
    echo &quot;position fen 'rn3rk1/pbppq1pp/1p2pb2/4N2Q/3PN3/3B4/PPP2PPP/R3K2R w KQ - 6 11'&quot;;
    echo &quot;go depth 30&quot;;
    (grep -m 1 &quot;bestmove&quot; &lt;(tail -f analysis.txt))&gt; /dev/null
) | stockfish | tee /dev/stderr &gt; analysis.txt
</code></pre>
<p>Yeah, it is literally catching it's own tail, but it does get to an end. :-)</p>
<p>Explanation:</p>
<ul>
<li><code>tail -f</code> watches the Stockfish's output file</li>
<li><code>grep -m 1 &quot;bestmove&quot;</code> filters the watched file until that string is found, then quits</li>
<li><code>&gt; /dev/null</code> is to prevent grep's output to be resent to Stockfish</li>
<li><code>| tee /dev/stderr</code> is optional, for you to see Stockfish's output in real time</li>
</ul>
 4362: <p>Edit: I think the main problem is that the uci protocol is a dialog. You have to wait for the "readyok" output from the engine before you can issue another command. Probably you just cannot forcefeed all commands in one go.</p>

<p>To quote the uci protocol:</p>

<p>"* all command strings the engine receives will end with '\n', …"</p>

<p>Possibly you just forgot about that in your second line. </p>
 12273: <p>look into python-chess package. It includes a protocol for interacting with engines.</p>
 12867: <p><strong>Solution</strong>: Use 'expect' script as shown below. Tested with stockfish_8_x64_modern. </p>

<blockquote>
  <p>BlindKungFuMaster: "I think the main problem is that the uci protocol is a dialog."
    <strong>I agree!</strong></p>
</blockquote>

<pre><code>#!/usr/bin/expect

spawn ~/stockfish_8_x64_modern

expect -timeout 1000  Linscott 

send "setoption name Ponder  value false \r isready \r"

expect -timeout 1000  readyok

send "setoption name Hash    value 2048 \r isready \r"

expect -timeout 1000  readyok

send "setoption name Threads value 8    \r isready \r"

expect -timeout 1000  readyok

send "setoption name MultiPV value 4    \r isready \r"

expect -timeout 1000  readyok

set row8 "rnbqkbnr"

set row7 "pppppppp"

set row6 "11111111"

set row5 "11111111"

set row4 "11111111"

set row3 "11111111"

set row2 "PPPPPPPP"

set row1 "RNBQKBNR"


send "position fen $row8/$row7/$row6/$row5/$row4/$row3/$row2/$row1 w KQkq - 0 1 moves e2e4 \r isready \r"

expect -timeout 1000  readyok

send "go infinite \r" 

expect -timeout 999999  readyok
</code></pre>
