簡體   English   中英

如何將 sbt 作為守護進程運行?

[英]How to run sbt as daemon?

我試過nohup "sbt run" &

返回: nohup: failed to run command 'sbt run': No such file or directory

並嘗試:

nohup sbt run &
[2] 7897
# nohup: ignoring input and appending output to ‘nohup.out’

當我回車期待進程繼續運行時,我收到:

[2]+  Stopped                 nohup sbt run

如何將 sbt 作為守護進程運行?

更新:

sbt run </dev/null &
[5] 8961

我認為 cd 一個目錄:

# cd ..

[5]+  Stopped                 sbt run < /dev/null  (wd: /home/sum)
(wd now: /home)

所以它作為守護進程啟動,但是如果我執行任何操作,例如更改目錄,它會終止進程嗎? 如何保持進程運行?

看起來sbt從您的終端請求輸入。 如果它真的不需要輸入(這可能是你在后台運行程序時的情況),你可以像這樣運行它:

sbt run </dev/null >output-file &

有關詳細信息,請參閱此答案

編輯

好的,現在這是一個難題。 簡短回答:運行sbt如下:

setsid nohup sbt run &

理由:

sbt停止的原因是SIGTTOU信號的到來。 它在幾種情況下被傳遞到后台進程,包括修改終端配置 這是我們的情況,因為根據strace -f sbt run &sbtsbt做了很多像這樣的黑魔法:

[pid 16600] execve("/usr/bin/sh", ["sh", "-c", "stty -g < /dev/tty"], [/* 75 vars */] <unfinished ...>

要解決此問題,您可以在不同的會話中運行sbt以將其與當前終端分離,這樣它就不會打開 /dev/tty 並弄亂我們的終端。

這也應該有效

sbt -Djline.terminal=jline.UnsupportedTerminal run &

來源: https : //github.com/sbt/sbt/issues/701

oleg-andriyanov 的回答在我的情況下不起作用。 (進程在啟動后很快退出)

在這種情況下,請嘗試在下面的 play ML 中編寫的 Mirko Stocker 命令作為替代方案。 https://groups.google.com/forum/#!topic/play-framework/ZgjrPgib0-8

# screen -d -m sbt run

您可以輕松地使用 tmux 來執行此操作(並保留其他任何內容)。 一個額外的功能是,如果您安裝在遠程服務器上,您可以將作業作為“會話”保存並重新連接到同一個終端“會話”。 https://www.linode.com/docs/networking/ssh/persistent-terminal-sessions-with-tmux/

1) 啟動你的 sbt 工作

sbt
run

2) 與 tmux 會話分離

ctrl+b (then release)
d

3) 顯示活動的 tmux 會話(僅發生在本地 tmux)

ctrl + b 
s

4)顯示遠程機器上的所有會話

$ tmux a

5) 附加會話

$ tmux attach-session (your-session-number)

如果你已經運行了 sbt 並且你想把它移到后台,那么一旦進程處於 STOPPED 狀態,向它發送一個 CONTINUE 信號

kill -s SIGCONT PID 

kill -s SIGCONT JOB_NUMBER

這將確保 sbt 進程現在在后台運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM