起動時にスクリプトを実行するには?

スクリプトを実行するにはどうすればよいですか 自動的に Ubuntuが起動したときに起動後に手動で実行する必要はありませんか?

一つのアプローチは、@rebootを追加することです cron(クロン) タスク:

  1. ランニング crontab -e あなたのcronを編集することができます。
  2. これに次のような行を追加します:

    @reboot /path/to/script

    コンピュータが起動すると、そのスクリプトが実行されます。

どのような種類のスクリプトを実行する必要があるかによって異なります。. サービスなどのために使用する必要があります upstart(アップスタート). しかし、ユーザースクリプトの場合、これらはgnomeによってセッションスクリプトとして起動されるべきです! システムの下で見てみましょう≫環境設定>スタートアップアプリケーション.

サイドノートでは、端末ログイン時にいくつかのスクリプトを実行する必要がある場合は、それらを追加することができます .bash_login ホームディレクトリ内のファイル。

14.04歳以上の方

単純なコマンド(実行し続ける必要がないコマンド)は、次のようなUpstartジョブを使用できます:

start on startuptaskexec /path/to/command

これをaに保存します .conf でファイル /etc/init (システムの起動時にrootとして実行する必要がある場合)、または ~/.config/upstart (ログイン時にユーザーとして実行する必要がある場合)。

次のコマンドを追加できます /etc/rc.local:

sudo nano /etc/rc.local

これにより、rootとしてコマンドが実行されます。

特定のユーザーとしてコマンドを実行するには、次のコマンドを使用します sudo -i -u (-i また、ログインシェルを実行するには)。 たとえば、永続的なSSHトンネルを確立するには、次のようにします。 myhost で定義されていますが、 johndoes ~/.ssh/config ファイル:

sudo -i -u johndoe autossh -nNT -L 1234:localhost:1234 myhost

注意すべき点は、以下の場合 /etc/rc.local 存在しませんでした(16.04以降のUbuntuの場合のように)、あなたは追加する必要があります シェバン線 上部に(例えば、 #!/bin/bash)、ファイルが実行可能であることを確認します:

sudo chmod a+x /etc/rc.local

15.04以降の場合:

(短命)を実行するには1 を使用して起動時のコマンド systemd、タイプのsystemd単位を使用できます OneShot. たとえば、次のように作成します /etc/systemd/system/foo.service を含む:

[Unit]Description=Job that runs your user script[Service]ExecStart=/some/commandType=oneshotRemainAfterExit=yes[Install]WantedBy=multi-user.target

次に実行します:

sudo systemctl daemon-reloadsudo systemctl enable foo.service

基本的に、これは単に変換しています 典型的な成り上がりの仕事 systemdのものに(を参照してください 新興ユーザーのためのSystemd).

複数のコマンドを使用して、同じサービスファイルから複数のコマンドを実行できます ExecStart ライン:

[Service]ExecStart=/some/commandExecStart=/another/command some argsExecStart=-/a/third/command ignore failure

コマンドは常にフルパスで指定する必要があります。 いずれかのコマンドが失敗した場合、残りのコマンドは実行されません。 A - パスがsystemdにゼロ以外の終了ステータスを無視するように指示する前に(失敗と考えるのではなく)。

関連:


ユーザーセッションの場合は、systemdユニットを次の場所で作成できます ~/.config/systemd 代わりに。 これは16.04以降で動作するはずですが、systemdを搭載したUbuntuの以前のリリースでは動作しません(ユーザーセッションにはまだUpstartが使用されていたため)。 ユーザー-セッション-ユニットは、システム-サービスと同じコマンドで制御できますが、ユーザー-セッション-ユニットの制御は、システム-サービスと同じコマンドで制御できます。 --user オプションが追加されました:

systemctl --user daemon-reloadsystemctl --user status foo.service

シェル構文

Upstartとは異なり、systemdは実行しないことに注意してください Exec* シェルを介したコマンド。 これは、いくつかの制限された変数展開と複数のコマンドを実行します(で区切られ ; しかし、それはシェルのような構文が行く限り、それについてです。 より複雑なものについては、リダイレクトやパイプなど、コマンドをラップします sh -c '...' または bash -c '...'.


1長命のデーモンとは対照的に。

コマンドを自動的に実行するには、さまざまな方法があります:

  1. その upstart(アップスタート) システムは、ディレクトリ内の設定を見つけるすべてのスクリプトを実行します /etc/init. これらのスクリプトは、システムの起動時に(またはシャットダウン要求などの特定のイベントに応答して)実行されるため、ユーザーと対話しないコマン

    あなたは読むことができる紹介を見つけることができます: http://upstart.ubuntu.com/getting-started.html manページ man 5 initman 8 init あなたに完全な詳細を与えます。

  2. という名前のシェルスクリプト .gnomerc あなたのホームディレクトリに自動的にGNOMEセッションにログインするたびに供給されます。 このスクリプトで設定した環境変数は、セッションで実行するすべてのプログラムによって表示されます。

    セッションは開始されないことに注意してください。 .gnomerc したがって、長時間実行されるプログラムを自動起動する場合は、次のように追加する必要があります & 実行中のシェルからそれをデタッチするために、プログラムの呼び出しに。

  3. メニューオプション システム-≫環境設定->スタートアップアプリケーション あなたのグラフィカルなセッションが開始されたときに起動する必要がありますどのようなアプリケーションを定義することができます(Ubuntuはかな これは、ほぼ同じ目的と範囲を持っています .gnomerc あなたが知っている必要はありませんを除いて、スクリプト sh 構文(ただし、どちらも使用できません sh プログラミング構築)。

$HOME/.config/autostart スタートアップアプリケーションリストが含まれます。 .desktop このフォルダ内のファイルは起動時に実行されます。 実行可能な権限が必要な場合があります(chmod +x startup.desktop).

のサンプル例 .desktop ファイル:

[Desktop Entry]Type=ApplicationExec="</path/to/script>"Hidden=falseNoDisplay=falseX-GNOME-Autostart-enabled=trueName=Startup Script

ここでは、 "</path/to/script>" パスに置き換えられます。 script.shスクリプトを配置すると myscript/usr/local/bin コマンドで直接実行できるように、次のように書くことができます myscript の代わりに "</path/to/script>".

のサンプル例 myscript.sh:

#!/bin/bash<commands to be executed>exit

結果:.desktop からファイルが起動されます。 $HOME/.config/autostart でスクリプトを実行しているかどうか、 Exec=

簡単なことのために、コマンドを追加することができます >>システム環境設定-セッション スクリプトの場所を指します。

または、/etc/initに追加することもできます。d/rc.ローカルまたは作る upstart(アップスタート) それはより多くの場合、ジョブ 低レベル 何か...

を見てみましょう https://help.ubuntu.com/community/UbuntuBootupHowto より多くの情報のため

cron 回答は、トップ投票とは異なる実装されています

この答えはまだ使用しています cron しかし、トップ投票の答えとは異なる方法を使用しています。 これはUbuntu16.04以降で動作しますが、おそらくはるかに早くサポートされています。 それは私が使用し始めたことだけです cron 16.04以降のコンピュータの起動時にジョブを実行する。

いつ行うのですか cron 逃げる?

コメントでは、誰かが尋ねました"彼らはいつ実行しますか?". あなたはsyslog/journalctlで伝えることができます:

$ journalctl -b | grep cronJan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Running @reboot jobs)Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[985]: (root) CMD (   /usr/local/bin/cron-reboot-cycle-grub-background)Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session closed for user rootJan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user rootJan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root

注意すべきことの一つは cron ジョブの実行状況をメールで送信することができます。 @reboot ジョブは非常に早いネットワークマネージャを実行し、あなたが入れない限り、電子メールが実行されません sleep スクリプトにコマンドを入力します。

スクリプトを配置する場所

ディレクトリにスクリプトを配置します /etc/cron.d:

$ ll /etc/cron.dtotal 44drwxr-xr-x   2 root root  4096 Nov 26 19:53 ./drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../-rw-r--r--   1 root root   244 Dec 28  2014 anacron-rw-r--r--   1 root root   148 Feb 18  2017 cycle-grub-background-rw-r--r--   1 root root   138 Mar  5  2017 display-auto-brightness-rw-r--r--   1 root root   460 Nov 26 19:53 nvidia-hdmi-sound-rw-r--r--   1 root root   102 Feb  9  2013 .placeholder-rw-r--r--   1 root root   224 Nov 19  2016 touch-vmlinuz-rw-r--r--   1 root root   700 Aug  5 11:15 turn-off-hyper-threading

スクリプトはどのように見えますか?

ここでは、各ブートを実行するために設定したスクリプトをいくつか紹介します:

$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin @reboot   root    /usr/local/bin/cron-reboot-cycle-grub-background$ cat /etc/cron.d/touch-vmlinuzSHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin@reboot   root    touch "/boot/vmlinuz-"`uname -r`

あなたが使用する必要があります upstart(アップスタート) このために。 Upstartは、自動的に起動されるUbuntuプロセスに使用されます。 これは、古いSystem-V initのような強化されたソリューションです。dスクリプト。 また、スクリプトの開始に前提条件を入れることもできます(つまり、ネットワークを実行する必要がありますか? など。)

カーネルが起動した直後にsystemdの前にスクリプトを実行したい場合は、AFAIKの方法は次のように追加しています init=/path/to/script のカーネルコマンドラインに /boot/grub/grub.cfg またはより多くの未来の証拠はあなた自身のメニュー記入項目を作ります /etc/grub.d/40_custom からメニューエントリをコピーすることで、 /boot/grub/grub.cfg そして、必要な変更を行う(と実行しています update-grub その後のために grub カスタムファイルを次の場所に追加するには /boot/grub/grub.cfg).

linux   /boot/vmlinuz-5.4.0-26-generic ... ro  quiet splash 

に変更

linux   /boot/vmlinuz-5.4.0-26-generic ... ro  quiet splash init=/path/to/script

適切に置くように注意してください。 #!/bin/bash 最初の行と exec /sbin/init (もし /sbin/init カーネルパニックを避けるために、最後にsystemd)を指します。

誰かがいつ、どこで、それは素晴らしいだろうの両方を示すことができれば。 他のアプリケーションが開始される前に起動するスクリプトを開始するには、少なくとも2つの方法があることを知っているので、これを言います(X11

+1@GabrielFairに。 問題の大部分は、元の質問と回答が10歳であることです。 私はまた、この問題を解決するにはあまりにも多くの方法があると付け加えたいと思います。 Unixの哲学の単純さに何が起こったのですか?! 誰かに知識を要求し、十分な点でこの投稿を書き直すか、最新のosバージョンの新しい最新の決定的な答えを追加してください。

この回答スレッド全体が混乱しています。 Stack Exchange形式はこの質問には最適ではないようです