web-dev-qa-db-ja.com

非特権ユーザーでupstartジョブを使用してスクリーンセッションを開始するにはどうすればよいですか?

起動時に新しい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"
6
Riley Tench

Upstartを介してscreenを呼び出すのは確かにややトリッキーです。ただし、存在しない/var/run/screenに関する最初の問題は簡単に解決できます。

Ubuntu 10.10から13.10には、起動時に/var/run/screenをクリーンアップおよび(再)作成する責任があるupstartタスクがあるため、upstartスクリプトがその後に実行されることを確認する必要があります。

start on stopped screen-cleanup

Ubuntu 10.04以前とUbuntu 14.04以降では、そのコードはinitスクリプト/etc/init.d/screen-cleanupにあります。これは、upstartジョブがrcの結果としてそれを参照できることを意味します。

start on stopped rc

ただし、screenはおそらく/ var/run/screenのパーミッションについてまだ文句を言うでしょう。これは、setsidを介してscreenを呼び出すことで回避できます。

exec setsid screen -Dm /some/command

Screenセッションは1回フォークするので、「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
4
Guido Nickels