web-dev-qa-db-ja.com

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

スクリプトを実行する方法自動 Ubuntuの起動時に、起動後に手動で実行する必要はありませんか?

511
myusuf3

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

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

14.04以前の

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

start on startup
task
exec /path/to/command

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

204
LassePoulsen

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

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

    @reboot /path/to/script
    

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

546
ceejayoz

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

Sudo nano /etc/rc.local
159

15.04以降の場合:

(短命)を実行するには1 systemd を使用して起動時にコマンドを実行すると、タイプOneShotのsystemdユニットを使用できます。たとえば、次を含む/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に変換するだけです( pstartユーザーのSystemd を参照)。

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

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

コマンドは常にフルパスで指定する必要があります。コマンドが失敗した場合、残りは実行されません。パスの前の-は、(失敗と見なすのではなく)0以外の終了ステータスを無視するように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寿命の長いデーモンとは対照的。

74
muru

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

  1. pstart システムは、ディレクトリ/etc/initで構成を検出するすべてのスクリプトを実行します。これらのスクリプトは、システムの起動中(またはシャットダウン要求などの特定のイベントへの応答)に実行されるため、ユーザーと対話しないコマンドを実行する場所です。すべてのサーバーはこのメカニズムを使用して開始されます。

    http://upstart.ubuntu.com/getting-started.html のマンページman 5 initおよびman 8 initで詳細を説明しています。

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

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

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

71
Riccardo Murri
$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=から起動されます

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

27
Pandya

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

または、/ etc/init.d/rc.localに追加するか、より多くの低レベルの場合は pstart ジョブを作成します。

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

18
tutuca

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

5
txwikinger

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

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

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コマンドを入力しない限り、初期のネットワークマネージャーとメールが実行されないことです( s)。

スクリプトを置く場所

スクリプトをディレクトリ/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`
4