私はCentOS 7を使用していますが、私の目的は5秒ごとにcronを作成することですが、調査したところ、1分間しかcronを使用できないため、シェルファイルを作成しています。
hit.sh
_while sleep 5; do curl http://localhost/test.php; done
_
しかし、私はそれを右クリックして手動でヒットしました。
私が欲しいのは、そのファイルのサービスを作成して、自動的に開始および停止できるようにすることです。
サービスを作成するスクリプト を見つけました
_#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....
# Source function library.
. /etc/init.d/functions
start() {
# code to start app comes here
# example: daemon program_name &
}
stop() {
# code to stop app comes here
# example: killproc program_name
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
# code to check status of app comes here
# example: status program_name
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
esac
exit 0
_
しかし、startメソッドまたはstopメソッドに何を書き込むかわかりません。同じ内容のhit.shをstart(){}
に配置してみましたが、stopメソッドの_}
_でエラーが発生しました。
コードサンプルを再利用する場合は、次のようになります。
#!/bin/bash
case "$1" in
start)
/path/to/hit.sh &
echo $!>/var/run/hit.pid
;;
stop)
kill `cat /var/run/hit.pid`
rm /var/run/hit.pid
;;
restart)
$0 stop
$0 start
;;
status)
if [ -e /var/run/hit.pid ]; then
echo hit.sh is running, pid=`cat /var/run/hit.pid`
else
echo hit.sh is NOT running
exit 1
fi
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
esac
exit 0
当然のことながら、サービスとして実行するスクリプトは、たとえば/usr/local/bin/hit.sh
、および上記のコードは/etc/init.d/hitservice
に移動する必要があります。
このサービスを実行する必要があるランレベルごとに、それぞれのシンボリックリンクを作成する必要があります。たとえば、/etc/init.d/rc5.d/S99hitservice
という名前のシンボリックリンクは、ランレベル5のサービスを開始します。もちろん、service hitservice start
/service hitservice stop
を使用して手動で開始および停止することもできます。
CentOS 7以降ではsystemdを使用していると思います。それがシステムに当てはまる場合は、次のことを試してください。
実行するスクリプトコマンドを/usr/bin/myscript
に配置します。
chmod +x
を使用してスクリプトを実行可能にすることを忘れないでください。
次のファイルを作成します。
/ etc/systemd/system/my.service
[Unit]
Description=My Script
[Service]
Type=forking
ExecStart=/usr/bin/myscript
[Install]
WantedBy=multi-user.target
すべてのsystemdサービスファイルを再読み込みします:systemctl daemon-reload
systemctl start my
でサービスを開始して、機能していることを確認します。
ボーナス:
Systemdサービスをテストするために、2つのウィンドウペインでtmux環境を起動することができます。上部ウィンドウはスクリプトからの出力(stdout
およびstderr
)を監視し、下部ウィンドウはサービスの再起動に使用されます。これにはtmux
がインストールされている必要があり、単純に次のようにします。
tmux new-session \; select-layout even-horizontal \; split-window -v journalctl -o cat --since=@$(date +%s) -f -u my \; rotate-window \; set -g status-bg colour0 \; set -g status-fg colour9 \; attach
次に、サービスを再起動します。
systemctl restart my
tmux
をctrl-d
で終了し、次にctrl-c
で終了します。
これはサービスとしての私のスクリプトです:
[Unit]
Description=To change In test buffer
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/test.sh
TimeoutStartSec=0
[Install]
WantedBy=default.target
Fpmを見てください。それはあなたのためにinitスクリプトを作成するツールです。多くのプラットフォーム(systemd、upstartなど)で動作します。
Bash Service Managerプロジェクトを参照してください: https://github.com/reduardo7/bash-service-manager
#!/usr/bin/env bash
export PID_FILE_PATH="/tmp/my-service.pid"
export LOG_FILE_PATH="/tmp/my-service.log"
export LOG_ERROR_FILE_PATH="/tmp/my-service.error.log"
. ./services.sh
run-script() {
local action="$1" # Action
while true; do
echo "@@@ Running action '${action}'"
echo foo
echo bar >&2
[ "$action" = "run" ] && return 0
sleep 5
[ "$action" = "debug" ] && exit 25
done
}
before-start() {
local action="$1" # Action
echo "* Starting with $action"
}
after-finish() {
local action="$1" # Action
local serviceExitCode=$2 # Service exit code
echo "* Finish with $action. Exit code: $serviceExitCode"
}
action="$1"
serviceName="Example Service"
serviceMenu "$action" "$serviceName" run-script "$workDir" before-start after-finish
$ ./example-service
# Actions: [start|stop|restart|status|run|debug|tail(-[log|error])]
$ ./example-service start
# Starting Example Service service...
$ ./example-service status
# Serive Example Service is runnig with PID 5599
$ ./example-service stop
# Stopping Example Service...
$ ./example-service status
# Service Example Service is not running