スクリプトを実行する方法自動 Ubuntuの起動時に、起動後に手動で実行する必要はありませんか?
実行する必要があるスクリプトの種類によって異なります。サービスなどでは、 pstart を使用する必要があります。ただし、ユーザースクリプトの場合、これらはgnomeによってセッションスクリプトとして起動する必要があります。 [システム]> [設定]> [起動アプリケーション]をご覧ください。
補足として、ターミナルログインで実行するスクリプトが必要な場合は、ホームディレクトリの 。bash_login ファイルに追加できます。
単純なコマンド(実行したままにする必要のないコマンド)では、次のようなUpstartジョブを使用できます。
start on startup
task
exec /path/to/command
これを.conf
ファイルに/etc/init
(システムの起動時にrootとして実行する必要がある場合)または~/.config/upstart
(ユーザーとして実行する必要がある場合)に保存しますログインします)。
1つのアプローチは、@ reboot cron タスクを追加することです。
crontab -e
を実行すると、cronを編集できます。次のような行を追加します。
@reboot /path/to/script
コンピュータが起動すると、そのスクリプトが実行されます。
/etc/rc.local
にコマンドを追加してはどうですか?このファイルを編集するには、Sudoアクセスを使用する必要があります。
Sudo nano /etc/rc.local
(短命)を実行するには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寿命の長いデーモンとは対照的。
コマンドを自動的に実行する方法はいくつかあります。
pstart システムは、ディレクトリ/etc/init
で構成を検出するすべてのスクリプトを実行します。これらのスクリプトは、システムの起動中(またはシャットダウン要求などの特定のイベントへの応答)に実行されるため、ユーザーと対話しないコマンドを実行する場所です。すべてのサーバーはこのメカニズムを使用して開始されます。
http://upstart.ubuntu.com/getting-started.html のマンページman 5 init
およびman 8 init
で詳細を説明しています。
ホームディレクトリにある.gnomerc
という名前のシェルスクリプトは、GNOMEセッションにログインするたびに自動的にソースされます。そこに任意のコマンドを入れることができます。このスクリプトで設定した環境変数は、セッションで実行するすべてのプログラムで表示されます。
.gnomerc
スクリプトが終了するまで、セッションは開始されないことに注意してください。したがって、長時間実行されるプログラムを自動起動する場合は、実行中のシェルからデタッチするために、プログラム呼び出しに&
を追加する必要があります。
メニューオプションシステム->設定->起動アプリケーションにより、グラフィカルセッションの開始時に起動するアプリケーションを定義できます好みに合わせて追加または削除します。これは.gnomerc
スクリプトとほぼ同じ目的と範囲を持ちますが、sh
構文を知っている必要はありません(ただし、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に追加するか、より多くの低レベルの場合は pstart ジョブを作成します。
詳細については、 https://help.ubuntu.com/community/UbuntuBootupHowto をご覧ください
これには pstart を使用する必要があります。 Upstartは、自動的に開始されるUbuntuプロセスに使用されます。古いSystem-V init.dスクリプトのような拡張ソリューションです。また、スクリプトの開始に前提条件を設定できます(つまり、ネットワークを実行する必要がありますか?など)。
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`