Gnu-Screen
如何使用非特權使用者的暴發戶作業啟動螢幕會話?
我正在嘗試創建一個
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"
通過 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 權限。這可以通過 setid 呼叫 screen 來解決:
exec setsid screen -Dm /some/command
您的螢幕會話將分叉一次,因此您需要添加“預期分叉”節以確保新貴遵循正確的 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
在您撥打電話之前,使用適當的權限創建
/var/run/screen
as 。root``screen