我正在嘗試建立一個screen
在啟動時啟動新會話的 Upstart 作業,我想在其中自動啟動java
可執行檔。這是我目前正在嘗試使用的 .conf 文件,儘管我已經嘗試了其他幾個文件:
description "Run the bungeecord jar"
start on (local-filesystems and net-device-up IFACE=eth0 and runlevel [2345])
stop on runlevel [016]
exec start-stop-daemon --start -c ridog --exec /usr/bin/screen -- -dmUS BungeeCord java -server -XX:UseSSE=4 -XX:+UseCMSCompactAtFullCollection -XX:MaxPermSize=356m -XX:ParallelGCThreads=6 -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+UseCompressedOops -XX:+AggressiveOpts -Xmx256M -jar BungeeCord.jar
pre-stop script
screen -S BungeeCord -X foo "end^M"
end script
據我所知,該腳本似乎工作正常,我可以運行sudo start bungeecord
並獲得預期結果,但是重新啟動機器不起作用。相反,我在以下位置收到此錯誤/var/log/upstart/bungeecord.log
:
Cannot make directory '/var/run/screen': Permission denied
我查過這個錯誤,搜尋結果模糊且不確定。我嘗試以 root 身分執行該命令,這消除了錯誤,但仍然沒有screen
會話。我嘗試過像這樣的不同命令:
su ridog -c "screen -dmS BungeeCord java -jar /home/ridog/BungeeCord/BungeeCord.jar"
答案1
透過 upstart 呼叫 screen 確實有點棘手。不過,關於不存在的第一個問題/var/run/screen
可以很容易解決。
在 Ubuntu 10.10 到 13.10 上,有一個 upstart 任務負責/var/run/screen
在啟動時清理和(重新)創建,因此您需要確保您的 upstart 腳本將在之後運行:
start on stopped screen-cleanup
在 Ubuntu 10.04 及更早版本以及 Ubuntu 14.04 及更高版本上,程式碼位於 init 腳本中,/etc/init.d/screen-cleanup
這表示新貴作業可以將其作為以下結果引用rc
:
start on stopped rc
然而,screen 可能仍然會抱怨 /var/run/screen 權限。可以透過 setsid 呼叫 screen 來解決此問題:
exec setsid screen -Dm /some/command
您的螢幕會話將分叉一次,因此您需要添加“expect fork”節以確保 upstart 遵循正確的 pid。
這是一個完整的範例腳本(至少需要 Ubuntu 12.04):
# screen startup script
# requires upstart v1.4 or newer
description "running top in screen session"
start on ( local-filesystems
and stopped rc )
stop on runlevel [!2345]
respawn
setuid test
setgid test
# "setsid screen -Dm" only forks once
expect fork
# use setsid to avoid screen complaining about /var/run/screen permissions.
exec setsid screen -Dm -S mytopsession /usr/bin/top
答案2
在撥打電話之前建立/var/run/screen
具有適當權限的權限。root
screen
答案3
問題解決了,我從使用切換upstart
到使用cron
。它變得簡單多了,現在一切都很好。
對於閱讀本文的任何人可能對我是如何做到的感到好奇,我做了一個簡單的shell script
:
#!/bin/bash
java -Xms256M -Xmx256M -jar /home/ridog/BungeeCord/BungeeCord.jar
並將其設定為在啟動時運行,並在以下位置新增一行crontab -e
:
@reboot screen -dmS BungeeCord sh /home/ridog/BungeeCord/run.sh
感謝您的幫忙!