[英]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 &
, sbt
在sbt
做了很多像這樣的黑魔法:
[pid 16600] execve("/usr/bin/sh", ["sh", "-c", "stty -g < /dev/tty"], [/* 75 vars */] <unfinished ...>
要解決此問題,您可以在不同的會話中運行sbt
以將其與當前終端分離,這樣它就不會打開 /dev/tty 並弄亂我們的終端。
這也應該有效
sbt -Djline.terminal=jline.UnsupportedTerminal run &
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.