起動時に画面でスクリプトを実行したいのですが。
これは機能しません:
@reboot pi screen -d -m /home/pi/db_update.py
ただし、ユーザーpiが機能するときにこれを手動で実行します。
screen -d -m /home/pi/db_update.py
私が欠けているものについて何か考えはありますか?
@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
)
起動時に何かに画面をアタッチする必要があるという、似ていますが少し異なる使用シナリオがありました。 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
にあります。
起動時に開始された画面で何が起こっているかを理解する簡単な方法がいくつかあります。
それも始まりますか?再起動後、grep CRON /var/log/syslog
は(CRON) INFO (Running @reboot jobs)
と言う行の後にCMD
行を返します
起動しても画面が表示されるまでに画面が消えてしまった場合、コマンドは終了します。これをデバッグする方法はいくつかあります。たとえば、次のようになります。
screen ... -- sh -c "your command; exec sh"
screen ... -- script -f yourcommand.boot.log -c "your command"
次に、ログファイルを調べます私の場合、それはローカルのPostgreSQLデータベースに接続しようとしたスクリプトでしたが、起動は完了せず、FATAL
エラーメッセージが表示されました。つまり、cron
とscreen
はすべてそのままで問題ありませんでしたが、マシンの起動シーケンスで組み合わせが早すぎました。
また、必ずしもグローバルcrontabファイル(/etc/crontab
)からユーザーファイルに切り替える必要はありません。たとえば、作成には中間点があります。 /etc/cron/local-pi-whathaveyou
コマンドを使用します。そうすれば、/etc
を調べる人には明らかですが、非特権ユーザーは維持されます。
これは回避策かもしれませんが、画面セッションを呼び出すシェルスクリプトを実行することで、この問題を克服しました。
[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