Skrip baris perintah yang dijalankan di latar belakang berada dalam keadaan berhenti

Saya memiliki skrip utilitas php pendek, saya menjalankannya dari cli hanya dengan:

php myscript.php

Script selalu berjalan, melakukan beberapa tugas secara berkala (tidak relevan dengan pertanyaan). Itu tidak memerlukan masukan apa pun dari pengguna. Setelah menjalankannya, saya biasanya menekan CTRL+z lalu menjalankan bg untuk meletakkan proses di latar belakang, dan semuanya baik-baik saja.

Jika saya menjalankannya sebagai:

php myscript.php &

skrip diletakkan di latar belakang pada saat awal, tetapi juga ditempatkan dalam keadaan berhenti. Contoh:

[1] 11513
[1]+  Stopped                 php myscript.php

bahkan menjalankan bg pada saat ini tidak membantu, saya harus menjalankan fg, lalu CTRL+z dan bg lagi untuk membuatnya berfungsi.

Ini skrip phpnya:

<?
while(true){
    echo 'hi '.time()."\n";
    sleep(30);
}
?>

Masalah saya adalah saya tidak dapat menjalankannya langsung di latar belakang, karena sistem menghentikannya, dan saya tidak mengerti alasannya. Bagaimana cara memperbaikinya?

pembaruan:

Saya membuat versi bash dari skrip yang sama, dan skrip tersebut dapat dijalankan dan diletakkan di latar belakang (berjalan dan tidak dihentikan) hanya dengan meluncurkannya dengan & pada akhirnya (script.sh &)

skrip.sh:

#!/bin/bash
while true; do
    echo `date`
    sleep 30
done

Mengapa skrip php dihentikan setelah diluncurkan di latar belakang, dan skrip bash tidak? Apa yang menyebabkan perilaku berbeda ini?


person Lorenzo Marcon    schedule 28.07.2013    source sumber
comment
alangkah baiknya mengetahui alasan dari pengguna yang memilih untuk menutup pertanyaan   -  person Lorenzo Marcon    schedule 28.07.2013
comment
Pertama, hal ini tidak ada hubungannya dengan administrasi sistem profesional. Kedua, Anda mengatakan bahwa tugas skrip Anda tidak relevan dengan pertanyaan tersebut tetapi cukup jelas bahwa tugas tersebut relevan dan seharusnya dijelaskan.   -  person Michael Hampton    schedule 28.07.2013
comment
Mengapa harus jelas? Kalau saya bilang tidak relevan, ternyata tidak: skrip hanya berisi while(true) dengan sleep :) Btw, saya menambahkannya ke pertanyaan saya, sehingga dapat membantu untuk memahami seberapa (tidak) relevannya hal itu. Untuk keperluan pertanyaan, tidak relevan tugas apa yang akan dilakukannya. Ini terhubung langsung dengan administrasi sistem profesional, karena saya menggunakan skrip ini di salah satu server linux saya (tujuan cadangan, untuk menambahkan beberapa detail).   -  person Lorenzo Marcon    schedule 28.07.2013


Jawaban (3)


Biasanya, proses apa yang Anda kirim ke latar belakang dengan & dan skrip menunggu masukan dari terminal, masuk ke keadaan berhenti.

Misalnya. punya skrip bash valecho:

#!/bin/sh
read val
echo $val

menjalankannya sebagai:

./valecho &

skrip akan berhenti.

Saat dijalankan sebagai

echo hello | ./valecho &

akan berjalan dan menyelesaikan dengan benar.

Jadi, periksa php Anda - mungkin ingin masukan dari stdin

Edit - berdasarkan komentar:

saya bukan pengembang php - tetapi baru mencoba skrip berikutnya (p.php)

<?php
    while(true){
        echo 'hi '.time()."\n";
        sleep(3);
    }
?>

dengan perintah:

php -f p.php &

dan berjalan dengan baik...jadi...maaf kalau bingung...

person jm666    schedule 28.07.2013
comment
terima kasih, tapi menurut saya hal ini tidak mungkin terjadi karena skrip tidak menunggu masukan pengguna apa pun. Anda dapat melihat kode di pertanyaan saya, sangat singkat. Juga, jika saya meletakkannya di latar depan dan kemudian di latar belakang tanpa memasukkan input apa pun, itu berhasil.. bagaimana ini bisa terjadi? - person Lorenzo Marcon; 29.07.2013
comment
@LorenzoMarcon lihat edit - berfungsi untuk saya... (hanya memiliki instalasi php default) - person jm666; 29.07.2013
comment
terima kasih sekali lagi, masalahnya di pc saya ini berfungsi juga untuk saya, tetapi di server tidak.. Saya sedang menyelidiki perbedaannya - person Lorenzo Marcon; 29.07.2013
comment
@LorenzoMarcon - hanya tip: set_time_limit(0); ? - person jm666; 29.07.2013
comment
Saya menemukan apa yang menyebabkan masalah, dan menulis jawabannya. Karena Anda memberi saya masukan yang benar (readline), saya akan memberikan jawaban yang diterima :) Terima kasih! - person Lorenzo Marcon; 29.07.2013
comment
@LorenzoMarcon Terima kasih - dan nikmati naskah Anda. ;) - person jm666; 29.07.2013

Saya menemukan apa yang menyebabkan masalah ini. Di PHP, jika modul readline diaktifkan, skrip baris perintah apa pun akan mengharapkan masukan, meskipun skrip ditulis untuk TIDAK menunggu masukan pengguna.

Untuk memeriksa apakah Anda mengaktifkan dukungan readline, jalankan saja:

php --info |grep "Readline Support"

dan periksa hasilnya. Jika Anda mendapatkan Readline Support => enabled maka Anda telah mengaktifkan readline dan Anda mungkin mengalami masalah yang dijelaskan dalam pertanyaan awal.

Cara yang tepat untuk menggunakan cli kapan adalah dengan secara eksplisit menentukan bahwa php tidak menggunakan terminal untuk input:

php myscript.php < /dev/null &

Info lebih lanjut: http://php.net/manual/en/book.readline.php

Alternatif:

./test.php >/dev/null &    

atau (lebih kreatif):

nohup php test.php > /dev/null 2>&1 &

(p.s.: Saya masih yakin pertanyaan ini milik ServerFault, btw.. masalah terpecahkan!)

person Lorenzo Marcon    schedule 29.07.2013
comment
Saya memiliki masalah yang sama. PHP saya berasal dari yum dan tidak dikompilasi; bagaimana cara menonaktifkan readline? - person DOOManiac; 03.01.2014
comment
apakah Anda mencoba menghapus paket php-readline (jika diinstal)? - person Lorenzo Marcon; 04.01.2014
comment
php myscript.php < /dev/null & menyelesaikan ini untuk saya, terima kasih atas penjelasan readlinenya - person Liam; 20.03.2014

Dari http://php.net/manual/en/book.readline.php :

Ketika readline diaktifkan, php mengalihkan mode terminal untuk menerima input buffer-line. Ini berarti bahwa cara yang tepat untuk menggunakan cli ketika Anda menyalurkan ke perintah interaktif adalah dengan secara eksplisit menentukan bahwa php tidak menggunakan terminal untuk input:

php myscript.php < /dev/null &

sumber

person Chris Montanaro    schedule 08.08.2013