回答:
実行する必要があるスクリプトの種類によって異なります。サービスなどの場合は、upstartを使用する必要があります。ただし、ユーザースクリプトの場合、これらはgnomeによってセッションスクリプトとして起動する必要があります。[システム]> [設定]> [起動アプリケーション]をご覧ください。
補足説明として、ターミナルログインで実行するスクリプトが必要な場合は、ホームディレクトリの.bash_loginファイルに追加できます。
単純なコマンド(実行したままにする必要のないコマンド)では、次のようなUpstartジョブを使用できます。
start on startup
task
exec /path/to/command
これを.conf
ファイル/etc/init
(システムの起動時にrootとして実行する必要がある場合)または~/.config/upstart
(ログイン時にユーザーとして実行する必要がある場合)に保存します。
system->pref->startup applications
もにも見つかり/etc/init/
ません~/.config/upstart
。では、スタートアップアプリケーションはどこで定義されていますか?
1つのアプローチは、@ reboot cronタスクを追加することです。
crontab -e
すると、cronを編集できます。次のような行を追加します。
@reboot /path/to/script
コンピュータが起動すると、そのスクリプトが実行されます。
@reboot
キーワードは広く知られていないため、良いヒントです。
man 5 crontab
と言い@reboot
ます。
rc.local
はシステムがこの時点(PATHなど)でより多くのセットアップを行っているように見えるためです。何かを呼び出すことに一生懸命であること奇妙である後に、システムの起動...
コマンドを追加するのはどう/etc/rc.local
ですか?このファイルを編集するには、sudoアクセスを使用する必要があります。
sudo nano /etc/rc.local
chmod 755 rc.local
追加#!/bin/bash
する必要があることに注意してください。
を使用して起動時に(短命)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寿命の長いデーモンとは対照的。
WantedBy
ここで使用される、例えば、ときに起動しますmulti-user.target
達しています。あなたは使用することができBefore
、After
、Requires
を参照してください、などman systemd.unit
RemainAfterExit
は開始するサービスとその望ましい動作に依存します。たとえば、/bin/df -h
<s> would </ s>にはが必要RemainAfterExit=no
です。
df
そのニーズに固有のものはありませんRemainAfterExit=no
。実行するたびにコマンドを繰り返し実行する場合を除きますsystemctl start foo
。
コマンドを自動的に実行する方法はいくつかあります。
成り上がりのシステムは、それがディレクトリ内の設定を見つけ、そこからすべてのスクリプトを実行します/etc/init
。これらのスクリプトは、システムの起動時に(またはシャットダウン要求などの特定のイベントに応じて)実行されるため、ユーザーと対話しないコマンドを実行する場所です。すべてのサーバーはこのメカニズムを使用して起動されます。
http://upstart.ubuntu.com/getting-started.htmlのmanページで読みやすい紹介を見つけることができ、完全な詳細man 5 init
をman 8 init
提供します。
.gnomerc
ホームディレクトリで指定されたシェルスクリプトは、GNOMEセッションにログインするたびに自動的にソースされます。そこに任意のコマンドを入れることができます。このスクリプトで設定した環境変数は、セッションで実行するすべてのプログラムで表示されます。
.gnomerc
スクリプトが終了するまでセッションは開始されないことに注意してください。したがって、長時間実行されるプログラムを自動起動する&
場合は、実行中のシェルから切り離すために、プログラムの呼び出しに追加する必要があります。
メニューオプションの[ システム]-> [設定]-> [起動アプリケーション]を使用すると、グラフィカルセッションの開始時に起動するアプリケーションを定義し(Ubuntuでかなり定義済み)、好みに合わせて追加または削除できます。これは、構文.gnomerc
を知る必要sh
がないことを除いて、スクリプトの目的と範囲とほぼ同じです(ただし、sh
プログラミング構成を使用することもできません)。
.gnomerc
明らかにUnityをロードする前Startup Applications
に実行され、 Unity をロードした後に実行されるようです。Unityのメニューバーにあるプログラムを実行する必要がありましたが、この場合は大きな違いがありました。
sudo update-rc.d myscript.sh defaults
ここで、/ etc / init.d / myscript.shはスクリプトであり、起動時にも実行されます。
$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=
したがって、起動時に目的のシェルスクリプトを実行できます。
簡単なことのために、スクリプトを保存する場所をポイントするコマンドをSystem-> Preferences-> Sessionsに追加できます。
あるいは、/ etc / init.d / rc.localに追加するか、より低レベルのものであればupstartジョブを作成できます。
詳細については、https://help.ubuntu.com/community/UbuntuBootupHowtoをご覧ください。
cron
上位の投票とは異なる回答が実装されましたこの回答は引き続き使用されますcron
が、上位の投票済みの回答とは異なる方法を使用します。これはUbuntu 16.04以降で機能しますが、おそらくもっと早くサポートされるでしょう。cron
16.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`
@reboot
です。
crontab -e
vimのようなインターフェイスのために黒人の芸術の1つと考える人もいます。一方、この答えは、脳が特定の方法で配線されている人にアピールするかもしれません。全員が同じ金型から鋳造されるわけではありません。繰り返しになりますが、この回答にはすでに1つの反対票があります。
crontab -e
、指示をグーグルで検索する必要があることが常にわかっている分、時間などのアスタリスク( "*")の記憶を表示します。私はまだ使用している/etc/cron.d
と/etc/cron.daily
私の選択に行きます。特に、ミラーリング/etc/udev/rules.d
と/etc/systemd/system-sleep
メソッドがあります。ちょうどいい感じのようです。
これにはupstartを使用する必要があります。Upstartは、自動的に開始されるUbuntuプロセスに使用されます。古いSystem-V init.dスクリプトのような拡張ソリューションです。また、スクリプトの開始に前提条件を設定することもできます(つまり、ネットワークを実行する必要がありますか?など)。