web-dev-qa-db-ja.com

@rebootcronジョブを介して `screen`を実行する

起動時に画面でスクリプトを実行したいのですが。

これは機能しません:

@reboot pi screen -d -m /home/pi/db_update.py

ただし、ユーザーpiが機能するときにこれを手動で実行します。

screen -d -m /home/pi/db_update.py

私が欠けているものについて何か考えはありますか?

4
Jrc

@reboot pi .../etc/crontabに追加する代わりに、ユーザーpiとしてcrontab -eを実行し、以下を追加する必要があります。

@reboot /usr/bin/screen -d -m /home/pi/db_update.py

画面へのフルパスを使用し(念のため、フルパスがなくても機能します)、/ home/piが暗号化されたファイルシステム上にないことを確認してください(そこで実行されます)。このコマンドは、cronデーモンが起動した後、またはユーザーがログインした後にのみアクセスできる可能性のあるものに依存することはできません。

db_update.pyに何かを追加する(/var/tmpのファイルに書き込んで実際に実行されることを確認する)か、pythonプログラム。


Lubuntu 13.04でテスト済み、python 2.7.4、次のエントリ:

@reboot screen -d -m /home/anthon/countdown.py

およびcountdown.py

#!/usr/bin/env python
import time
for x in range(600,0,-1):
    print x
    time.sleep(1)

(およびchmod 755 countdown.py

6
Anthon

起動時に何かに画面をアタッチする必要があるという、似ていますが少し異なる使用シナリオがありました。 2台のヘッドレスサーバーがあり、1台にはシリアルのみの出力があります。これをシリアルケーブルを介して他のヘッドレスサーバーに接続しているので、画面を使用してシリアル接続を介して対話する必要がありました。また、シリアルセッションを表示していないときに生成された出力をキャプチャしたことを確認する必要があります。

これはrootのcrontabにあります

@reboot    /usr/bin/screen -d -m -c .screenrc -L /dev/ttyS0

セキュリティ更新が適用されている場合、サーバーは設定された時刻に再起動します。必要に応じて確認できるように、具体的な名前のログファイルが必要です。私の.screenrcファイルにはこのエントリがあります

logfile "/root/.screen_%H_%Y%m%d_%c.txt"

したがって、次の画面セッションが開始されると、ログファイルは/home/root/.screen_$HOSTNAME_$YYYYMMDD_$h:$mm.txtにあります。

0
user208145

起動時に開始された画面で何が起こっているかを理解する簡単な方法がいくつかあります。

  • それも始まりますか?再起動後、grep CRON /var/log/syslog(CRON) INFO (Running @reboot jobs)と言う行の後にCMD行を返します

  • 起動しても画面が表示されるまでに画面が消えてしまった場合、コマンドは終了します。これをデバッグする方法はいくつかあります。たとえば、次のようになります。

    • 後でシェルを実行して、実行を継続し、出力を確認できるようにします。 https://unix.stackexchange.com/a/47279/103306 -screen ... -- sh -c "your command; exec sh"
    • script(1)内でコマンドを実行します。例: screen ... -- script -f yourcommand.boot.log -c "your command"次に、ログファイルを調べます

私の場合、それはローカルのPostgreSQLデータベースに接続しようとしたスクリプトでしたが、起動は完了せず、FATALエラーメッセージが表示されました。つまり、cronscreenはすべてそのままで問題ありませんでしたが、マシンの起動シーケンスで組み合わせが早すぎました。

また、必ずしもグローバルcrontabファイル(/etc/crontab)からユーザーファイルに切り替える必要はありません。たとえば、作成には中間点があります。 /etc/cron/local-pi-whathaveyouコマンドを使用します。そうすれば、/etcを調べる人には明らかですが、非特権ユーザーは維持されます。

0
Josip Rodin

これは回避策かもしれませんが、画面セッションを呼び出すシェルスクリプトを実行することで、この問題を克服しました。

[dude@server ~]$ crontab -l | grep sh
@reboot /home/dude/.autoscreen/start.sh
[dude@server ~]$ cat /home/dude/.autoscreen/start.sh
#!/bin/bash
cd ~
screen -S myname -d -m custom_script
0
dougBTV