起動時にルートとしてbashスクリプトを実行する方法は?


0

私はこれでいくつかの問題を抱えています。ブート時にairodump-ngを起動することになっているスクリプトがありますが、通常はスクリプトの最初の部分だけを実行します。

systemdサービスファイルを作成して有効にしようとしましたが、スクリプトはルートとして実行されません。

これをarch linuxとdebianの両方で試しましたが、debianではinitスクリプトルートを使用しましたが、それでもスクリプトはルートとして実行されませんでした。

私のスクリプト:

!#/bin/bash
ifconfig wlan0 down
sleep 5
airmon-ng start wlan0
sleep 5
airodump-ng mon0

exit 0

サービスファイル:

[Unit]
Description=auto start airmon

[Service]
ExecStart=~/scripts/cap.sh
Type=oneshot
User=root


[Install]
WantedBy=multi-user.target

編集*これはsystemctl statusからの出力です:

ap.service - auto start airmon
Loaded: error (Reason: Invalid argument)
Active: inactive (dead)

Jan 13 13:03:44 alarmpi systemd[1]: [/etc/systemd/system/cap.service:5] Executable   path is not absolute, ignoring: ~/scripts/cap.sh
Jan 13 13:03:44 alarmpi systemd[1]: cap.service lacks ExecStart setting. Refusing.
Jan 13 13:47:08 alarmpi systemd[1]: [/etc/systemd/system/cap.service:5] Executable path is not absolute, ignoring: ~/scripts/cap.sh
Jan 13 13:47:08 alarmpi systemd[1]: cap.service lacks ExecStart setting. Refusing.

2
あなたの問題は、必ずしも終了しないかもしれないコマンドを実行していることだと思うので&、行の最後に追加して(sleepもちろん、コマンドではなく)バックグラウンドにそれらをフォークする必要があるかもしれません。
オタクウォーラー14年

しかし、ターミナルでrootとしてスクリプトを実行すると、すべて正常に動作します。
Skilo Skilo 14年

2
最良の結果を得るには、サービスファイルとsystemctl status $YOURSERVICE(そのサービスが何であれ)の出力を質問に入れてください。そして、そのスクリプトを正しく入力したことを再確認してください。ここで入力エラーである可能性のあるかなり明白なエラーに、人々はすぐにジャンプします。
JdeBP 14年

だから私はスクリプトの場所を変更し、今では動作しているようだ、systemdはホームディレクトリが好きではないと思います。
Skilo Skilo 14年

DebianまたはArchを使用していますか?systemdを使用していますか?
Braiam

回答:


2

ジャーナルは実際にあなたのサービスが開始しない理由を教えています。

つまり、サービスユニットはシェルスクリプトではないということです。いくつかの非常に特殊化されたアイテムを除いて~、サービスユニットの拡張や環境変数のようなものは取得しません。渡す名前ExecStartは、実行するプログラムの通常の絶対パスでなければなりません。あなたの名前は~/system/cap.sh、(もちろん)絶対パスではなく相対パスです。これはシェルではありません。 ~メタキャラクターではありません。これは普通の文字で、現在のディレクトリのサブディレクトリと呼ばれるものを示してい~ます。

systemd ExecStartは、相対パス名での受け入れを拒否します。そして、明らかにExecStart、サービスの開始方法を説明する有効なものを持たないサービスを開始することを拒否します。

それを修正した後、実際に適切に実行可能なスクリプトになるようにスクリプトを修正する必要があります。実行許可が必要#!であり、最初の行のスペルが適切である必要があります。また、Bourne Againシェルを必要とするものは何もないので、システムブートストラップの一部として実行されるスクリプトでBourne AgainシェルではなくAlmquistを使用するというDebianのリードに従うことをお勧めします。

最初にシステムを初期化するシステムと並行して、ネットワークファイルをいじらないように、おそらくサービスファイルを調整する必要があります。 それが意味することはあなたのシステム特有であるので、あなたはAfter=あなたのユニットファイルに何として置くべきかを考え出す必要があります。

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