権限のないユーザーで upstart ジョブを使用して screen セッションを開始するにはどうすればよいですか?

権限のないユーザーで upstart ジョブを使用して screen セッションを開始するにはどうすればよいですか?

起動時に新しいセッションを開始する Upstart ジョブを作成しscreen、その中で実行可能ファイルを自動的に開始したいと考えています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

このエラーについて調べてみましたが、検索結果は不明瞭で決定的ではありません。コマンドをルートとして実行してみましたが、エラーは解消されましたが、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ため、upstart ジョブは次のようにしてそれを参照できますrc

start on stopped rc

ただし、screen はおそらく /var/run/screen の権限についてまだ文句を言うでしょう。これは、setsid 経由で screen を呼び出すことで回避できます。

exec setsid screen -Dm /some/command

screen セッションは 1 回フォークするので、upstart が正しい pid に従うようにするには、「expect fork」スタンザを追加する必要があります。

完全なサンプル スクリプトは次のとおりです (少なくとも 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を作成してください。rootscreen

答え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

ご協力いただきありがとうございます!

関連情報