Saya tidak ingin melakukan hal yang benar dengan membuat skrip systemd baru, saya hanya ingin skrip init lama saya bekerja lagi sekarang karena saya telah memutakhirkan sistem saya ke OS yang menggunakan systemd.
Saya telah meneliti secara singkat cara mengkonversi skrip init dan cara menulis skrip systemd, tapi saya yakin mempelajarinya dengan benar dan melakukannya dengan benar akan memakan waktu beberapa jam.
Situasi saat ini adalah:
systemctl start solr
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.
Dan:
sudo service solr start
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.
Saat ini, saya hanya ingin kembali bekerja. Apa jalan perlawanan paling tidak untuk membuat ini bekerja lagi?
Pembaruan
Saya tidak ingin memikirkan ini semua - saya benar-benar tidak - tetapi saya harus dan saya telah menggali petunjuk pertama saya:
sudo systemctl enable solr
Synchronizing state for solr.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d solr defaults
insserv: warning: script 'K01solr' missing LSB tags and overrides
insserv: warning: script 'solr' missing LSB tags and overrides
Executing /usr/sbin/update-rc.d solr enable
update-rc.d: error: solr Default-Start contains no runlevels, aborting.
The halaman tidak kompatibel untuk systemd mengatakan bahwa:
Informasi dependensi header LSB penting. Implementasi SysV pada banyak distribusi tidak menggunakan informasi dependensi yang dikodekan dalam header skrip init LSB, atau menggunakannya hanya dengan cara yang sangat terbatas. Karena itu mereka sering salah atau tidak lengkap. Namun systemd sepenuhnya menafsirkan header ini dan mengikutinya secara dekat saat runtime
Saya pikir itu berarti skrip saya tidak akan berfungsi sampai itu diperbaiki.
Script yang dipertanyakan:
#!/bin/sh
# Prerequisites:
# 1. Solr needs to be installed at /usr/local/solr/example
# 2. daemon needs to be installed
# 3. Script needs to be executed by root
# 4. $INSTALL_ROOT must be set
# This script will launch Solr in a mode that will automatically respawn if it
# crashes. Output will be sent to /var/log/solr/solr.log. A pid file will be
# created in the standard location.
start () {
echo -n "Starting solr..."
# Reset ulimit or else get issues with too many open files (https://issues.apache.org/jira/browse/SOLR-4)
ulimit -n 10000
# start daemon
daemon --chdir='/usr/local/solr/example' --command "java -jar -server start.jar -DINSTALL_ROOT=$INSTALL_ROOT" --respawn --output=/var/log/solr/solr.log --name=solr --verbose
RETVAL=$?
if [ $RETVAL = 0 ]
then
echo "done."
else
echo "failed. See error code for more information."
fi
return $RETVAL
}
stop () {
# stop daemon
echo -n "Stopping solr..."
daemon --stop --name=solr --verbose
RETVAL=$?
if [ $RETVAL = 0 ]
then
echo "done."
else
echo "failed. See error code for more information."
fi
return $RETVAL
}
restart () {
daemon --restart --name=solr --verbose
}
status () {
# report on the status of the daemon
daemon --running --verbose --name=solr
return $?
}
case "$1" in
start)
start
;;
status)
status
;;
stop)
stop
;;
restart)
stop
sleep 15
start
;;
*)
echo $"Usage: solr {start|status|stop|restart}"
exit 3
;;
esac
exit $RETVAL
Jawaban:
Serius, file unit systemd sepele untuk ditulis untuk layanan seperti ini ... atau untuk sebagian besar layanan.
Ini seharusnya membuat Anda sekitar 95% dari perjalanan ke sana. Masukkan ini ke dalam, misalnya,
/etc/systemd/system/solr.service
Perhatikan hal-hal yang tidak ada di sini, seperti file log dan semacamnya; systemd akan secara otomatis menangkap dan mencatat output layanan dengan nama layanan.
sumber
systemd
memiliki beberapa keanehan, seperti skrip ini tidak akan memiliki log yang persisten kecuali Anda mengaktifkannya. Pada akhirnya, itu berhasil dan dorongan Anda adalah yang saya butuhkan, terima kasih.Bagi saya lebih mudah untuk hanya menambahkan blok info init di header seperti yang disarankan di sini :
Kemudian, jalankan
sudo systemctl enable solr
.sumber
"contains no runlevels, aborting"
kesalahan terkenal ) sampai saya menyadarinya: # ketiga hilang di baris kedua Anda (seharusnya### BEGIN INIT INFO
). Saya bertaruh itu juga akan menjelaskan mengapa Anda memiliki begitu sedikit suara juga.Solusi lain untuk menggunakan skrip init solr legacy dengan systemd:
sumber
Lebih nyaman menjalankan Solr menggunakan skrip start yang disediakan .
File unit systemd terlihat seperti ini:
Perhatikan bahwa Anda juga dapat menggunakan variabel lingkungan Anda dengan menambahkan
EnvironmentFile
ke[Service]
bagian. Scriptbin/solr
menghormati variabel lingkungan, lihat saja di dalamnya.sumber
Diuji pada Debian: Tambahkan '_SYSTEMCTL_SKIP_REDIRECT = OHYES' di awal skrip.
Fanboy Systemd mungkin tidak menyukainya tapi hei, saya tidak suka systemd, jadi ada :).
sumber
SYSTEMCTL_SKIP_REDIRECT=true
dalam redhat_
(garis bawah) sebelumSYSTEMCTL
, seperti ini:_SYSTEMCTL_SKIP_REDIRECT=1
. Jika Anda mencobanya dari commandline Anda juga perlu mengekspor var itu.Saya memiliki kesalahan yang sama ketika mencoba untuk menggunakan skrip init LSB pada CentOS 7. Root menyebabkan ternyata skrip tersebut adalah tautan simbolis. Setelah diganti dengan salinan aslinya, semuanya bekerja dengan baik.
sumber