rc.local で開始された Screen セッションは、ルートの下の screen -ls には表示されません。

rc.local で開始された Screen セッションは、ルートの下の screen -ls には表示されません。

CentOS 7で。

/etc/rc.d/rc.localを編集して実行可能にし、ここでスクリーンセッションを開始します。

問題は、rootとしてサーバーにログインしたときにrc.localで起動され、rootとしてscreen -ls実行されているスクリーンセッションが表示されないことです。

これにより、ps axuf | grep -i screen画面セッションがアクティブになり、画面内でプロセスが実行されていることがわかります。

このスクリーンセッションにどのように参加しますか?

私のrc.local画面セクションは次のとおりです。

/usr/bin/screen -wipe
/usr/bin/screen -dmS scr1 /script/rsync1.sh
/usr/bin/screen -dmS scr2 /script/rsync2.sh
/usr/bin/screen -dmS scr3 /script/rsync3.sh
/usr/bin/screen -dmS scr4 /script/rsync4.sh
/usr/bin/screen -dmS scr5 /script/rsync5.sh

ps auxfサーバーの起動後にスクリーンセッションが開始されることがわかります。

root@server [~]# ps auxf | grep -i screen
root       90642  0.0  0.0 112648   988 pts/0    S+   21:54   0:00          \_ grep --color=auto -i screen
root        3384  0.0  0.0 127784  2212 ?        Ss   21:33   0:00 /usr/bin/SCREEN -dmS scr1 /script/rsync1.sh
root        3390  0.0  0.0 127784  2252 ?        Ss   21:33   0:00 /usr/bin/SCREEN -dmS scr2 /script/rsync2.sh    
root        3393  0.0  0.0 127784  2252 ?        Ss   21:33   0:00 /usr/bin/SCREEN -dmS scr3 /script/rsync3.sh
root        3398  0.0  0.0 127784  2252 ?        Ss   21:33   0:00 /usr/bin/SCREEN -dmS scr4 /script/rsync4.sh
root        3403  0.0  0.0 127784  2248 ?        Ss   21:33   0:01 /usr/bin/SCREEN -dmS scr5 /script/rsync5.sh

これを試してみると、screen -r scr1その画面が実行されていないことがわかります。

セッションがrootとして実行されているので、なぜ見ることができないのかわかりません。

コマンドの先頭に/usr/bin/sudoを追加しようとしましたが、完全に起動しませんでした。

Jul 10 22:07:37 server systemd[1]: Starting /etc/rc.d/rc.local Compatibility...
Jul 10 22:07:39 server rc.local[3645]: sudo: sorry, you must have a tty to run sudo
Jul 10 22:07:39 server rc.local[3645]: sudo: sorry, you must have a tty to run sudo
Jul 10 22:07:39 server rc.local[3645]: sudo: sorry, you must have a tty to run sudo
Jul 10 22:07:39 server rc.local[3645]: sudo: sorry, you must have a tty to run sudo
Jul 10 22:07:39 server rc.local[3645]: sudo: sorry, you must have a tty to run sudo
Jul 10 22:07:39 server systemd[1]: rc-local.service: control process exited, code=exited status=1
Jul 10 22:07:39 server systemd[1]: Failed to start /etc/rc.d/rc.local Compatibility.
Jul 10 22:07:39 server systemd[1]: Unit rc-local.service entered failed state.
Jul 10 22:07:39 server systemd[1]: rc-local.service failed.

また、screen -wiperc.localの外部で手動で開始されたセッションは、最初は影響を受けないようです。

サーバーがクラッシュした場合、手動で起動した画面はまだscreen -lsルートで停止しているようです。

@rebootを使用してcrontabに追加する代わりに、これをrc.localに追加しました。なぜなら、システムがクラッシュしたり再起動したりせず、電源が切れても動作しないからです。 @rebootは再起動時にcronでのみトリガーされることを理解しているからです。

$ SCREENDIRに対するStephen Harrisのコメントで解決されました。

起動スクリプトでscreen -ls> /tmp/xyzzy.$$(または同様のファイル名)を実行すると、ソケットが保存されているディレクトリが表示されます。再接続しようとしたときにセッションを表示するには、このディレクトリを指すように$ SCREENDIRを設定する必要があります。 – スティーブン・ハリスの10時間前

/var/run/screen/S-rootrc.localはSCREENDIRとして使用されます。

ルートはSCREENDIRとして使用されるため、/root/screensrc.localのセッションは表示されません。

メモ:

SCREENDIRとして使用するフォルダを見つけるためにrc.localにscreen -ls> /tmp/xyzzy.$$を追加する必要はありません。これを行うと、次のような出力systemctl status rc-localが出力に表示されます。

rc.local[3258]: No Sockets found in /var/run/screen/S-root.

完了後、export SCREENDIR=/var/run/screen/S-root screen -ls表示画面はrc.localから始まります。

答え1

$ SCREENDIRに対するStephen Harrisのコメントで解決されました。

起動スクリプトでscreen -ls> /tmp/xyzzy.$$(または同様のファイル名)を実行すると、ソケットが保存されているディレクトリが表示されます。再接続しようとしたときにセッションを表示するには、このディレクトリを指すように$ SCREENDIRを設定する必要があります。 – スティーブン・ハリスの10時間前

/var/run/screen/S-rootrc.localはSCREENDIRとして使用されます。

ルートはSCREENDIRとして使用されるため、/root/screensrc.localのセッションは表示されません。

メモ:

SCREENDIRとして使用するフォルダを見つけるためにrc.localにscreen -ls> /tmp/xyzzy.$$を追加する必要はありません。これを行うと、次のような出力systemctl status rc-localが出力に表示されます。

rc.local[3258]: No Sockets found in /var/run/screen/S-root.

完了後、export SCREENDIR=/var/run/screen/S-root screen -ls表示画面はrc.localから始まります。

関連情報