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


520

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


3
誰かがWHENとWHEREの両方を表示できるとしたら、それは素晴らしいことです。これは、他のアプリケーション(X11など)が開始される前に起動するスクリプトを開始する方法が少なくとも2つあることを知っているためです
-Buttink

1
この回答スレッド全体は混乱です。スタックExchange形式は、この質問のために最も適しているとは思われない
ガブリエルフェア

1
それは実際に非常に面白いです。いくつの方法がありますか?
devios1

回答:


206

実行する必要があるスクリプトの種類によって異なります。サービスなどの場合は、upstartを使用する必要があります。ただし、ユーザースクリプトの場合、これらはgnomeによってセッションスクリプトとして起動する必要があります。[システム]> [設定]> [起動アプリケーション]をご覧ください。

補足説明として、ターミナルログインで実行するスクリプトが必要な場合は、ホームディレクトリの.bash_loginファイルに追加できます。

14.04以前の

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

start on startup
task
exec /path/to/command

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


58
SOとStackExchangeの実行方法を考慮して、upstartスクリプトの例とその配置場所を教えてください。それはこれをはるかに良い答えにします。あなたのリンクは、メンテナンスされていないと言っており、新興のクックブックを見ると、それは巨大です。どこから始めればいいのかわからない。
Ehteshチョードリー

2
ルートとしてコマンドを実行する必要がある場合はどうなりますか?
ドパトラマン

1
@dopatraman答えは、これを持つすべてのプロセスがルートとして実行されると述べています。
AStopher

4
この回答を更新して、upstart(Ubuntu 15.04+)ではなくsystemdを実行しているシステムで何をすべきかを説明してください。

3
この答えは私には意味がありません。にリストされているアプリケーションは、にsystem->pref->startup applicationsもにも見つかり/etc/init/ません~/.config/upstart。では、スタートアップアプリケーションはどこで定義されていますか?
phil294

553

1つのアプローチは、@ reboot cronタスクを追加することです。

  1. 実行crontab -eすると、cronを編集できます。
  2. 次のような行を追加します。

    @reboot /path/to/script
    

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


85
この@rebootキーワードは広く知られていないため、良いヒントです。
ジャタニズム

12
いいね これがトリガーされる正確なアイデアはありますか?
オリ

2
それで...電源が切れて、電源が回復したときにPCが再び回転した場合、これは実行されませんか?
マイクウィルズ

18
@siamii:起動時に実行される(cronデーモンの起動時)man 5 crontabと言い@rebootます。
jfs

9
これはすごい。これまでのところ、これrc.localはシステムがこの時点(PATHなど)でより多くのセットアップを行っているように見えるためです。何かを呼び出すことに一生懸命であること奇妙である後に、システムの起動...
カルティクT

161

コマンドを追加するのはどう/etc/rc.localですか?このファイルを編集するには、sudoアクセスを使用する必要があります。

sudo nano /etc/rc.local

19
これは、システムの起動時にいくつかのスクリプトを簡単に実行する方法という質問に最も直接的に答えます。upstartはより複雑なタスクを実行します。デーモンプロセスを開始します。
ドッグウェザー

1
/etc/rc.localがbashスクリプトを開始している間に、upstartはデーモンプロセスを開始しますか?
ドナート

5
すべきですか?これは最近では機能しません。
-DaVince

4
DoenstはUbuntu 17.04 systemdで動作します
qodeninja

3
このファイルを自分で作成した場合(私が行ったように)、でファイルを実行可能ファイルに変更し、最初の行にchmod 755 rc.local追加#!/bin/bashする必要があることに注意してください。
-psitae

77

15.04以降の場合:

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

[Unit]
Description=Job that runs your user script

[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

次に実行します:

sudo systemctl daemon-reload
sudo systemctl enable foo.service

基本的に、これは典型的なUpstartジョブをsystemdに変換するだけです(Upstartユーザー向けのSystemdを参照)。

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

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

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

関連:


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

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

シェル構文

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


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


ジョブに優先順位を設定することは可能ですか?または、最初に開始される別のサービスに依存することを指定しますか?
r3wt

1
@ r3wtはい、それを行うにはさまざまな方法があります。WantedByここで使用される、例えば、ときに起動しますmulti-user.target達しています。あなたは使用することができBeforeAfterRequiresを参照してください、などman systemd.unit
muru

それが欠けていたのは@PerlDuckだけではありません。ありがとう!
ムル

どういたしまして。—ところで、これRemainAfterExitは開始するサービスとその望ましい動作に依存します。たとえば、/bin/df -h<s> would </ s>にはが必要RemainAfterExit=noです。
PerlDuck

@PerlDuck dfそのニーズに固有のものはありませんRemainAfterExit=no。実行するたびにコマンドを繰り返し実行する場合を除きますsystemctl start foo
ムル

71

コマンドを自動的に実行する方法はいくつかあります。

  1. 成り上がりのシステムは、それがディレクトリ内の設定を見つけ、そこからすべてのスクリプトを実行します/etc/init。これらのスクリプトは、システムの起動時に(またはシャットダウン要求などの特定のイベントに応じて)実行されるため、ユーザーと対話しないコマンドを実行する場所です。すべてのサーバーはこのメカニズムを使用して起動されます。

    http://upstart.ubuntu.com/getting-started.htmlのmanページで読みやすい紹介を見つけることができ、完全な詳細man 5 initman 8 init提供します。

  2. .gnomercホームディレクトリで指定されたシェルスクリプトは、GNOMEセッションにログインするたびに自動的にソースされます。そこに任意のコマンドを入れることができます。このスクリプトで設定した環境変数は、セッションで実行するすべてのプログラムで表示されます。

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

  3. メニューオプションの[ システム]-> [設定]-> [起動アプリケーション]を使用すると、グラフィカルセッションの開始時に起動するアプリケーションを定義し(Ubuntuでかなり定義済み)、好みに合わせて追加または削除できます。これは、構文.gnomercを知る必要shがないことを除いて、スクリプトの目的と範囲とほぼ同じです(ただし、shプログラミング構成を使用することもできません)。


11
3)「これは.gnomercスクリプトとほぼ同じ目的と範囲を持ちます」が、.gnomerc明らかにUnityをロードするStartup Applicationsに実行され Unity ロードしたに実行されるようです。Unityのメニューバーにあるプログラムを実行する必要がありましたが、この場合は大きな違いがありました。
そのブラジル人

1
@ ruda.almeidaそれを指摘してくれてありがとう。答えは統一以前に書かれていました。
リッカルドムリ

1
sudo update-rc.d myscript.sh defaultsここで、/ etc / init.d / myscript.shはスクリプトであり、起動時にも実行されます。
ダンダスカレスク

27
$HOME/.config/autostart
  • この場所には、スタートアップアプリケーションのリストが含まれています。
  • .desktop 起動時に実行されるファイルをここに置くことができます。

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

次の.desktopファイルを入れて$HOME/.config/autostart与えchmod +xます:

[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script

ここに"</path/to/script>"あなたへのパスに置き換えられますscript.sh
(通常はすることをお勧めします/usr/local/binと言う直接コマンドで実行することができますので、それmyscriptに置き換え"</path/to/script>")。

サンプルの例script.sh

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

結果: .desktopファイルが起動され、$HOME/.config/autostartそこからスクリプトが実行されますExec=

したがって、起動時に目的のシェルスクリプトを実行できます。


18

簡単なことのために、スクリプトを保存する場所をポイントするコマンドをSystem-> Preferences-> Sessionsに追加できます。

あるいは、/ etc / init.d / rc.localに追加するか、より低レベルのものであればupstartジョブを作成できます。

詳細については、https://help.ubuntu.com/community/UbuntuBootupHowtoをご覧ください。


7

cron 上位の投票とは異なる回答が実装されました

この回答は引き続き使用されますcronが、上位の投票済みの回答とは異なる方法を使用します。これはUbuntu 16.04以降で機能しますが、おそらくもっと早くサポートされるでしょう。cron16.04以降、コンピューターの起動時にジョブの実行に使用し始めただけです。

いつcron実行されますか?

コメントでは、誰かが「いつ実行するのか」と尋ねました。syslog / journalctlで確認できます:

$ journalctl -b | grep cron
Jan 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-02
Jan 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 root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root

注意すべきことの1つはcron、ジョブの実行ステータスとジョブ実行のステータスをメールで送信できる@rebootためsleep、スクリプトにコマンドを入力しない限り、早期のネットワークマネージャーとメールが実行されないことです。

スクリプトを置く場所

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

$ ll /etc/cron.d
total 44
drwxr-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/sh
PATH=/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-vmlinuz
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    touch "/boot/vmlinuz-"`uname -r`

1
cronjobを追加するにはさまざまな方法がありますが、非常に投票された答えとあなたの答えの中核はまだ@rebootです。
ムル

crontabを追加する別の方法をaskubuntu.com/q/2368/158442に投稿する必要があります。これは、Cronジョブの追加に関する明示的なものです。
ムル

1
失礼ですが同意できません。問題の答えの中核は、crontab -evimのようなインターフェイスのために黒人の芸術の1つと考える人もいます。一方、この答えは、脳が特定の方法で配線されている人にアピールするかもしれません。全員が同じ金型から鋳造されるわけではありません。繰り返しになりますが、この回答にはすでに1つの反対票があります。
WinEunuuchs2Unix

2
ああ、お願いします。あなたと私は、エディターを変更できることを知っています。
ムル

@muruはい、おそらくあなたが教えてくれたので、エディターをnanoや他のいくつかのCLIのようなものに変更することを学んだからです。しかし、私はgeditキャンプにいます。またcrontab -e、指示をグーグルで検索する必要があることが常にわかっている分、時間などのアスタリスク( "*")の記憶を表示します。私はまだ使用している/etc/cron.d/etc/cron.daily私の選択に行きます。特に、ミラーリング/etc/udev/rules.d/etc/systemd/system-sleepメソッドがあります。ちょうどいい感じのようです。
WinEunuuchs2Unix

5

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.