Linuxで起動して通常のユーザースクリプトプログラムを自動的に実行
テスト環境:Fedora 7、管理者:root、一般ユーザー:test 1
実装目標:Linux起動時に、一般ユーザtest 1のルートディレクトリの下にあるスクリプトプログラムtestを自動的に実行する.py、このプログラムは実行するたびに自動的にローカルログファイルに記録を追加します.ソースコードは以下の通りです.
Linuxは起動時に/etc/rcを自動的に実行する.dディレクトリの下の初期化プログラムなので、起動タスクをこのディレクトリの下に置くには、2つの方法があります.
シナリオ1:
1.rcのため.localはすべての初期化が完了した後に実行されるので、起動スクリプトを書くことができます.
2.rootアカウントでLinux,vi/etc/rcにログインする.d/rc.localファイルを編集し、最後に実行するスクリプトプログラムを2行追加します.
cd/home/test 1--このステップは少なくありません.そうしないと、'testを開く権限がないことを示します.log'ファイル
su test 1-c「python/home/test 1/test.py」--実行するコマンドをパラメータとしてレベルsuを渡す
シナリオ2:
1.init.dディレクトリの下はすべて実行可能なプログラムで、彼らは実はサービスのスクリプトで、一定のフォーマットによって編纂して、Linuxは起動する時自動的に実行して、Windowsの下のサービスのようです
2.rootアカウントでログイン、vi/etc/rc.d/init.d/mystart、以下の内容を追加します.
3.chmod+r/etc/rcを実行する.d/init.d/mystart、直接実行可能
4.chkconfig--add mystartを実行し、そのサービスを構成に追加する
5.chkconfig--list mystartを実行し、サービスプロセスのステータスを表示します.
まとめ:
両方のシナリオの核心は、test 1にユーザーを切り替え、Pythonプログラムを起動するコマンドを実行することであり、サービスを行うメリットは、start、stop、restart、resetなど、複数のインタラクティブコマンドを定義できることです.サービスの実行中にも対応する操作ができます.最初は、一般的な考え方で以下のシナリオを書きましたが、なかなか実行できませんでした.
すべてが間違っているように見えますが、最初の行のコマンドだけが実行されていることに気づき、その後は実行されていません.test 1ユーザーを終了するまで実行が完了しているようです.理由を分析すると、Linuxが起動した時にrootアカウントの下でsu test 1を実行するのは新しいshellスクリプトを開いたのと同じなので、次のコードは新しいShellスクリプトが終わるのを待っているので、メインプログラムでサブプログラムを呼び出したように、サブプログラムはデッドサイクルで、すぐに出てきて結果として次のコードはデッドサイクルになるのを待っています.原因がわかれば、解決策は比較的簡単になります.上記のスクリプトプログラムを実行するときは、自分のシェルから離れないようにすることです.新しいShellを開くことに関与していないため、実行コマンドをsuのパラメータとして渡すことができます.そのため、所望のスクリプトプログラムを正常に実行することができ、指定したスクリプトプログラムを起動して自動的に起動することができます.
実装目標:Linux起動時に、一般ユーザtest 1のルートディレクトリの下にあるスクリプトプログラムtestを自動的に実行する.py、このプログラムは実行するたびに自動的にローカルログファイルに記録を追加します.ソースコードは以下の通りです.
from datetime import datetime
now=datetime.now()
f=open('test.log','a')
f.write('%s '%now)
f.close()
Linuxは起動時に/etc/rcを自動的に実行する.dディレクトリの下の初期化プログラムなので、起動タスクをこのディレクトリの下に置くには、2つの方法があります.
シナリオ1:
1.rcのため.localはすべての初期化が完了した後に実行されるので、起動スクリプトを書くことができます.
2.rootアカウントでLinux,vi/etc/rcにログインする.d/rc.localファイルを編集し、最後に実行するスクリプトプログラムを2行追加します.
cd/home/test 1--このステップは少なくありません.そうしないと、'testを開く権限がないことを示します.log'ファイル
su test 1-c「python/home/test 1/test.py」--実行するコマンドをパラメータとしてレベルsuを渡す
シナリオ2:
1.init.dディレクトリの下はすべて実行可能なプログラムで、彼らは実はサービスのスクリプトで、一定のフォーマットによって編纂して、Linuxは起動する時自動的に実行して、Windowsの下のサービスのようです
2.rootアカウントでログイン、vi/etc/rc.d/init.d/mystart、以下の内容を追加します.
#!/bin/bash
#chkconfig:2345 80 05 -- ,0 ,
6 , 。80 ,05
#description:mystart service
RETVAL=0
start(){ --
echo -n "mystart serive ..."
cd /home/test1
su test1 -c "python /home/test1/test.py"
}
stop(){ --
echo "mystart service is stoped..."
}
case $1 in -- case,
start)
start
;;
stop)
stop
;;
esac
exit $RETVAL
3.chmod+r/etc/rcを実行する.d/init.d/mystart、直接実行可能
4.chkconfig--add mystartを実行し、そのサービスを構成に追加する
5.chkconfig--list mystartを実行し、サービスプロセスのステータスを表示します.
まとめ:
両方のシナリオの核心は、test 1にユーザーを切り替え、Pythonプログラムを起動するコマンドを実行することであり、サービスを行うメリットは、start、stop、restart、resetなど、複数のインタラクティブコマンドを定義できることです.サービスの実行中にも対応する操作ができます.最初は、一般的な考え方で以下のシナリオを書きましたが、なかなか実行できませんでした.
su test1 -- test1
cd /home/test1 --
python test.py -- python
exit -- test1
すべてが間違っているように見えますが、最初の行のコマンドだけが実行されていることに気づき、その後は実行されていません.test 1ユーザーを終了するまで実行が完了しているようです.理由を分析すると、Linuxが起動した時にrootアカウントの下でsu test 1を実行するのは新しいshellスクリプトを開いたのと同じなので、次のコードは新しいShellスクリプトが終わるのを待っているので、メインプログラムでサブプログラムを呼び出したように、サブプログラムはデッドサイクルで、すぐに出てきて結果として次のコードはデッドサイクルになるのを待っています.原因がわかれば、解決策は比較的簡単になります.上記のスクリプトプログラムを実行するときは、自分のシェルから離れないようにすることです.新しいShellを開くことに関与していないため、実行コマンドをsuのパラメータとして渡すことができます.そのため、所望のスクリプトプログラムを正常に実行することができ、指定したスクリプトプログラムを起動して自動的に起動することができます.