私はそれがすべての始まりで使用されることを望みます/etc/rc.local
。
たとえば、私のスクリプトが呼び出され、startscript.sh
保存場所/home/debian
は次のようになります。まず、名前付きファイルを生成しようとしたtest.log
後、別の操作を実行します。
しかし、起動時にエラーを読みました。touch: cannot touch ‘test.log’: Permission denied
rc.local
私の理解によると、rootとして実行されると、実行されるすべてのエントリもrootとして実行される必要があるため、test.log
とにかく生成する必要があります。どのようにこれが可能ですか?
startscript.sh
:
#!/bin/sh
touch test.log
#... other stuff
rc.local
フラグメント:
#!/bin/sh -e
#.. other stuff
sh /home/debian/startscript.sh
答え1
このアプローチには2つの問題があります。 1つはルートによって実行されることです。したがって、生成されたすべてのファイルは、実行しrc.local
ない限りルートが所有します。chown
第二に、これはセキュリティ上の脆弱性であり、rootとして実行されたコードはroot権限を持たないユーザーによって修正される可能性があります。
より良い方法は、次を使用することです。@再起動cron
権限のないユーザーの時間指定子。すでに持っているなら予約されたことファイルを編集してこの行を追加し、crontab <yourcrontab>
コマンドを実行します。または、crontab -e
コマンドを使用してこの行を直接入力します。
@reboot /home/debian/startscript.sh
sh
で始まるので、スクリプトを実行する必要はありません#!/bin/sh
。
答え2
ディストリビューションで以下を使用するsystemd
場合/etc/rc.local
早すぎる、ルートファイルシステムがまだ読み取り専用であるか、他のファイルシステムがまだマウントされていない間。
.service
実行中のsystemdファイルがrc.local
特定の順序の依存関係で構成されていない場合は、systemd
できるだけ早く実行されます。
systemctl cat rc-local.service
実行中のサービスの完全な定義を表示するには、実行してくださいrc.local
。すべてのAfter=
ラインに注意を払い、システム起動プロセスで満足できる最速のポイントを検討してください。After=
設定要件に合わせて1〜2行を追加する上書きファイルを追加できます。