Tulis program yang memulai sendiri lagi ketika selesai.
Seharusnya tidak ada lebih dari satu contoh program yang berjalan pada saat yang sama. Bahkan untuk momen sekecil apa pun.
Anda dapat mengabaikan setiap instance yang dimulai secara manual oleh pengguna selama siklus Anda. Tetapi kode Anda seharusnya tidak melakukannya dalam siklus restart Anda.
Program dapat dimulai setelah jumlah waktu berapa pun, asalkan dijamin akan mulai lagi.
Satu-satunya cara untuk menghentikan siklus adalah dengan mematikan prosesnya.
Solusi Anda seharusnya tidak melibatkan restart lingkungan (di mana program sedang berjalan, termasuk OS, mesin, VM, shell dll). Hanya program Anda yang diizinkan memulai ulang.
popularity-contest
mikrobia
sumber
sumber
exec
ada di linux?shutdown -r -t 0 -f
".Jawaban:
Skrip Bash, 3 karakter (Terpendek, mungkin paling elegan, meskipun diakui kontroversial)
Cukup tempatkan instance baru dari dirinya sendiri di latar belakang (proses baru), lalu berhenti. Instance baru kemungkinan akan tetap berada di antrian run-scheduler hingga instance sebelumnya selesai.
Peringatan - ini sulit dilakukan
kill
, karena PID terus berubah. Mengganti nama sementara file skrip mungkin merupakan cara paling sederhana untuk memutus siklus.Sistem single-core diasumsikan. Tentu saja ini tidak realistis dengan Linux pada perangkat keras bare-metal modern, tetapi mudah dikonfigurasi saat dijalankan dalam VM. Kami mungkin dapat mencapai trik serupa menggunakan
taskset
, tetapi itu akan mengurangi dampak dari solusi 3-char.Jawaban ini sedikit membengkokkan aturan karena menerapkan arti khusus "berlari". Akan ada saat-saat ketika proses baru telah
fork()
ed dan proses lama masih hidup - yaitu mungkin untuk mengamati lebih dari satu PID. Namun proses baru akan ditempatkan pada run-queue scheduler Linux untuk menunggu siklus CPU, sementara proses yang ada akan terus dijalankan. Pada titik ini semua yang perlu dilakukan oleh proses yang ada adalah untukbash
dirinya sendiriexit()
. Ini memang membutuhkan waktu yang terbatas, meskipun saya cukup yakin bahwa itu akan dilakukan jauh sebelum kuantum kutu waktu / scheduler saat ini dilakukan. Bukti pendukung adalah fakta yangbash
dimulai dan dimatikan dalam 2ms di VM saya:Bukti pendukung lebih lanjut bahwa proses baru tidak benar-benar berjalan sampai proses sebelumnya dilakukan dapat dilihat pada
strace
output:Dalam output, kita melihat proses asli memiliki PID 6929. Kita bisa melihat
fork()
panggilan (sebenarnyaclone()
), yang mengembalikan PID baru dari 6930. Pada titik ini ada 2 PID, tetapi saat ini hanya 6929 yang sedang berjalan:strace
Output penuh di sini.Kita dapat melihat bahwa 6930 tidak mengeluarkan panggilan sistem apa pun hingga 6929 selesai sepenuhnya. Masuk akal untuk mengasumsikan bahwa ini berarti 6930 tidak berjalan sama sekali sampai 6929 selesai. The
perf
utilitas akan menjadi cara utama untuk membuktikan ini.sumber
top
bukan alat yang tepat untuk digunakan di sini. Namun saya melihat bahwatime bash -c :
hanya membutuhkan 2ms pada Ubuntu VM saya, jadi saya tidak berpikir itu tidak masuk akalbash
untuk menyelesaikan shutdownnya sebelum penjadwalan kuantum dilakukan.Solusi 1
PHP, 32 karakter
Ia mengirim header dan kemudian berhenti. Setelah 3 detik, halaman dimuat ulang.
mengajukan a.php
Ini dapat dihentikan dengan menghentikan eksekusi halaman sebelum header dikirim, atau hanya dengan membunuh browser.
Solusi 2
PHP, 2 halaman
Mari kita perhatikan dua file dua program berbeda. Dua file berada di folder yang sama.
mengajukan a.php
file b.php
Mengakhiri salah satu halaman sebelum tajuk dikirim mengakhiri program (membunuh browser juga berfungsi).
Berikut program yang sama di
ASP.NET
file a.aspx
file b.aspx
sumber
SH
Ini akan bekerja pada semua sistem yang sesuai dengan Posix.
Untuk membunuhnya, hapus file atau gunakan
atrm
.sumber
pesta
exec
mengganti shell tanpa membuat proses baru. Ini memastikan bahwa tidak mungkin ada instance kedua.sumber
~/.bash_profile
!$0
adalah-bash
ketika.bash_profile
bersumber, sehingga hanya akan menghasilkan kesalahan sintaks.exec ${0##-}
dalam~/.bash_profile
karya :-)Penjadwal Tugas Windows (Asli)
C ++. Mimpi buruk pemrograman COM. Memenuhi semua persyaratan tantangan.
Kompilasi dengan MSVC (atau MinGW GCC jika Anda memiliki semua dependensi).
Program akan memulai dan mendaftarkan tugas satu kali dengan penjadwal tugas Windows untuk memulai sendiri 5 detik kemudian (Control Panel -> Administrative Tools -> Task Scheduler untuk melihat, tugas diberi nama "Restarter"). Program akan berhenti selama 5 detik untuk memberi Anda kesempatan untuk membunuhnya sebelum membuat tugas.
Persyaratan Tantangan:
Mulai lagi sendiri saat selesai. Iya nih. Tugas dijadwalkan sebelum keluar dari program.
Tidak lebih dari satu contoh program yang berjalan pada saat yang sama. Iya nih. Program keluar sepenuhnya dan tidak berjalan selama 5 detik. Dimulai oleh penjadwal.
Anda dapat mengabaikan setiap instance yang dimulai secara manual oleh pengguna selama siklus Anda. Ya, sebagai efek samping dari menggunakan nama tugas yang konstan.
Selama dijamin mulai lagi. Ya, asalkan Penjadwal Tugas berjalan (ini dalam konfigurasi Windows standar).
Satu-satunya cara untuk menghentikan siklus adalah dengan mematikan prosesnya. Ya, prosesnya bisa dimatikan selama jendela 5 detik saat sedang berjalan. Program menghapus tugas sebelum penundaan 5 detik, membunuhnya pada saat ini tidak akan meninggalkan tugas yang menyimpang dalam penjadwal.
Solusi Anda seharusnya tidak melibatkan memulai kembali dari lingkungan Ya.
By the way, jika ada yang bertanya-tanya mengapa aplikasi Windows dulu sangat tidak stabil (sebelum munculnya. NET dan C #), ini adalah salah satu alasan mengapa. Jumlah penanganan kesalahan yang diperlukan (seandainya saya memasukkannya), manajemen sumber daya, dan verbositas mengatur situasi yang sangat rawan kesalahan jika seorang programmer bahkan sedikit malas (kode di atas sangat malas).
Alternatif yang jauh lebih mudah dan lebih pendek adalah dengan memanggil schtasks.exe. Saya telah mengirimkan versi dengan itu dalam skrip .BAT juga.
sumber
BBC BASIC - penghargaan untuk Snow Patrol
Emulator di bbcbasic.co.uk
Yang ini sedikit berbeda. Ini mencetak satu bait dari lagu "Run" dan memainkan arpeggio dari akord sehingga Anda dapat bernyanyi bersama. Itu terinspirasi oleh fakta bahwa perintah untuk mengeksekusi (dan karena itu baris terakhir dari program) tentu saja berjalan.
Semua variabel dihapus pada awal program, sehingga dibutuhkan warna layar yang ditinggalkan oleh iterasi sebelumnya untuk memutuskan ayat apa yang akan dicetak berikutnya.
OUTPUT (montase dari 4 tangkapan layar yang berbeda)
sumber
HTML / JavaScript:
Kode memicu kerusakan halaman yang sedang berjalan, kemudian penciptaan kembali contoh lain dari dirinya sendiri ketika browser memuat halaman baru.
AFAIK, satu-satunya jalan keluar adalah dengan membunuh tab yang digunakan laman.
EDIT: sesuai permintaan populer, kode HTML5 yang valid:
sumber
C
Program ini bertindak seperti banyak malware. Tepat sebelum ditutup, ia membuat skrip shell di direktori / tmp. Itu garpu untuk memulai skrip shell, yang memungkinkan program asli menutup dan membatalkan PID asli. Setelah periode waktu yang singkat (2 detik) script shell memulai proses baru dengan program. Untuk singkatnya, lokasi program terprogram sebagai '/ tmp / neverend /'.
Hanya ada satu proses 'Neverend' yang berjalan pada satu waktu. Setiap proses baru mendapat PID baru. Cara termudah untuk membunuh ini adalah dengan menghapus yang dapat dieksekusi. Jika Anda ingin membuatnya lebih ganas, Anda dapat menyalin skrip yang dapat dieksekusi dan skrip untuk memastikan ada beberapa salinan pada program pada disk kapan saja.
sumber
system()
jika aturan tidak menghitung fork + exec/bin/sh
sebagai program pelengkap.Perl
Script mengeluarkan perintah sistem untuk mematikan dirinya sendiri, dan menyalurkan hasilnya ke instance lain dari dirinya sendiri. Penerjemah Perl digunakan untuk melakukan pembunuhan, karena alasan lintas platform.
Hentikan kegilaan dengan menghapus skrip.
sumber
Atari 8-bit Basic
Ditandai untuk:
Secara internal itu membersihkan struktur internal, pada dasarnya menghapus program, sebelum menjalankannya lagi dari daftar.
Ini pada dasarnya berbeda dari:
Yang tokenizes ke:
Ini adalah loop tak terbatas dasar. Ketika Anda menjalankannya, Anda melihat perbedaan dalam kecepatan (pertama lebih lambat).
sumber
LIST
, Anda tidak akan melihatnya berjalan. Saya memilihLIST
karena memiliki input terpendekL.
. Saya suka ide memasukkannya ke dalam buffer keyboard, itu tentu saja cukup singkat!Return
? Seberapa besar buffer keyboard? Pada VIC-20 dan C64, ini sepuluh byte. Sebuah program yang melakukan cukup colekan untuk memuat buffer keyboard mungkin tidak cocok dengan buffer keyboard, tetapi saya telah menulis program yang akan memodifikasi diri mereka sendiri dengan mencetak perubahan pada layar diikutiRUN
, dan melakukan beberapaReturn
penekanan tombol. Hal-hal seperti itu sangat berguna pada 64 karena tidak memiliki perintah [IIRC]IN
yang Atari miliki untuk menggabungkan baris ke dalam sebuah program.Pada IBM Mainframe yang menjalankan z / OS, Anda menjalankan utilitas yang menyalin dataset (file) ke dataset lain (file). Input adalah sumber dari JCL (Job Control Language) yang telah Anda kirimkan untuk menjalankannya. Outputnya adalah Internal Reader (INTRDR). Anda juga perlu memastikan bahwa sistem Anda tidak mengizinkan jalannya beberapa nama pekerjaan yang identik. Baik untuk menggunakan kelas pekerjaan yang hanya memiliki satu inisiator (tempat di mana JOB dapat berjalan dalam batch).
Tidak ada PID yang terlibat (dalam z / OS), jadi gagal dengan tantangan yang ditetapkan.
Anda menghentikan proses dengan pengeringan dan / atau pembilasan. Jika ada yang tidak beres, dengan mengeringkan dan / atau menyiram, mengumpat, menendang, mencoba memulai dengan hangat dan akhirnya dengan memulai dengan dingin atau mengenai Tombol Merah Besar (dan menembak programmer).
Saya mungkin telah melebih-lebihkan di sepanjang jalan, tetapi jangan mencoba ini di tempat kerja ...
Contoh menggunakan SORT. Rincian pada kartu JOB sangat tergantung pada situs. Kebijakan situs dapat melarang atau mencegah penggunaan INTRDR. Kelas tertentu mungkin diperlukan untuk menggunakan INTRDR. Jika kebijakan situs Anda melarang penggunaannya, jangan gunakan kecuali Anda ingin mengambil barang-barang Anda untuk berjalan-jalan di kotak kardus.
Meskipun ada kegunaan yang baik untuk INTRDR, jangan menggunakannya untuk tujuan ini . Anda bahkan tidak akan memiliki kesempatan untuk mendapatkan kotak Anda.
Utilitas lain tersedia. Program cepat akan mudah dilakukan juga, cukup baca file, tulis file.
Jika Anda ingin contoh kesalahan ini, coba: http://ibmmainframes.com/viewtopic.php?p=282414#282414
Cara tradisional untuk menyalin dataset adalah dengan menggunakan utilitas IBM IEBGENER, sebagaimana ugoren menyinggung dalam komentar mereka.
Namun, hari-hari ini, banyak situs akan memiliki IEBGENER "alias" untuk ICEGENER. ICEGENER akan, jika dapat, menggunakan DFSORT IBM (atau SyncSort saingannya) untuk melakukan salinan, karena produk-produk SORT jauh lebih dioptimalkan untuk IO daripada IEBGENER.
Saya hanya memotong perantara dengan menggunakan SORT.
Jika Anda bekerja di situs IBM Mainframe, Anda tahu format kartu JOB yang harus Anda gunakan. Kartu JOB minimal seperti yang saya tunjukkan, tanpa komentar. Komentar akan menjadi penting, karena Anda mungkin seharusnya memberikan informasi akuntansi, misalnya. Nama pekerjaan kemungkinan akan memiliki format khusus situs.
Beberapa situs melarang, atau mencegah, penggunaan INTRDR. Waspadalah.
Beberapa situs memungkinkan beberapa pekerjaan dengan nama yang sama dijalankan pada saat yang bersamaan. Waspadalah.
Meskipun kecuali Anda adalah Programmer Sistem Anda tidak dapat mengatur kelas seperti itu, Anda harus mencari kelas yang hanya memungkinkan satu inisiator. Dengan itu, prosesnya cukup aman - tetapi pastikan benar-benar bahwa kelas berfungsi sebagaimana dijelaskan. Uji. Tidak dengan pekerjaan ini.
Jika Anda seorang Programer Sistem, Anda tahu untuk tidak melakukan apa pun di luar remit Anda. kata Nuff.
Dengan satu pekerjaan dengan nama yang sama diizinkan pada saat yang sama dan satu inisiator, ini akan menjadi aliran awal pekerjaan / selesai pekerjaan berikutnya mulai / selesai - sampai Anda mengisi gulungan (hal buruk yang harus dilakukan) dengan output dari ribuan pekerjaan (atau kehabisan nomor pekerjaan). Tonton Konsol JES untuk pesan peringatan.
Pada dasarnya, jangan lakukan ini. Jika Anda melakukannya, jangan lakukan itu di mesin Produksi.
Dengan sedikit mempercepat, saya akan mempertimbangkan Jawaban lain untuk bagaimana melakukannya pada sistem operasi IBM Mainframe lain, z / VSE ... z / VSE menggunakan JCL. z / OS menggunakan JCL. Mereka berbeda :-)
sumber
IEBGENER
hanya menyalin.Python (72 byte)
Bisa jadi lebih kecil kurasa. Pertama, dengan meng-hardcoding nama file (alih-alih menggunakan
__file__
). Tapi di sini, Anda bisa meletakkan kode ini dalam file dan menjalankannya, apa pun namanya :)sumber
&&
menjadi&
.Penjadwal Tugas Windows (.BAT)
Skrip kumpulan Windows. Memenuhi semua persyaratan tantangan.
Sejauh yang saya bisa lihat, ini adalah satu-satunya solusi Windows yang memenuhi semua persyaratan dan tidak memiliki dependensi yang tidak standar (solusi saya yang lain serupa tetapi membutuhkan kompilasi).
Program berperilaku serupa dengan jawaban C ++ / COM saya .
Program akan memulai dan mendaftarkan tugas satu kali dengan penjadwal tugas Windows untuk memulai sendiri hingga 60 detik kemudian (Control Panel -> Administrative Tools -> Penjadwal Tugas untuk melihat, tugas diberi nama "Restarter"). Program akan berhenti selama 5 detik untuk memberi Anda kesempatan untuk membunuhnya sebelum membuat tugas.
Menggunakan antarmuka baris perintah Penjadwal Tugas
schtasks.exe
. Aritmatika dalam skrip adalah untuk menghitung offset waktu sambil menjaga waktu tetap valid dan dalam format HH: MM.Persyaratan Tantangan:
Mulai lagi sendiri saat selesai. Iya nih. Tugas dijadwalkan sebelum keluar dari program.
Tidak lebih dari satu contoh program yang berjalan pada saat yang sama. Iya nih. Program keluar sepenuhnya dan tidak berjalan selama ~ 60 detik. Dimulai oleh penjadwal.
Anda dapat mengabaikan setiap instance yang dimulai secara manual oleh pengguna selama siklus Anda. Ya, sebagai efek samping dari menggunakan nama tugas yang konstan.
Selama dijamin mulai lagi. Ya, asalkan Penjadwal Tugas berjalan dan schtasks.exe hadir (keduanya benar dalam konfigurasi Windows standar).
Satu-satunya cara untuk menghentikan siklus adalah dengan mematikan prosesnya. Ya, prosesnya bisa dimatikan selama jendela 5 detik saat sedang berjalan. Program menghapus tugas sebelum penundaan 5 detik, membunuhnya pada saat ini tidak akan meninggalkan tugas yang menyimpang dalam penjadwal.
Solusi Anda seharusnya tidak melibatkan memulai kembali dari lingkungan Ya.
Catatan: Karena antarmuka baris perintah terbatas, waktu mulai ulang harus ditentukan dalam beberapa menit dan tugas tidak akan dimulai ulang pada laptop tanpa adaptor AC terpasang (maaf).
sumber
Unix shell
Saya belum melihat banyak solusi yang bergantung pada program yang tidak terkait untuk memulai kembali. Tapi inilah tepatnya
at(1)
utilitas dibuat untuk:Sulit untuk benar-benar menangkap program berjalan, karena hanya berjalan sekali per menit dan keluar dengan sangat cepat. Untungnya
atq(1)
utilitas tersebut akan menunjukkan kepada Anda bahwa itu masih berjalan:Dan
atrm(1)
akan memungkinkan Anda untuk memutus siklus:Anda dapat mengganti
1 minute
dengan1 hour
, atau1 week
. Atau berikan1461 days
untuk memiliki program yang berjalan setiap 4 tahun sekali.sumber
PowerShell
Saya menyalahgunakan (dan mungkin melanggar) aturan saya sendiri.
Diperlukan waktu tak terbatas untuk memulai ulang sendiri.
Itu bisa dibunuh dengan membunuh proses host.
Tunggu dan lihat saja ;)
sumber
while true; do sleep 1; done
selimut, bukan?Pesta
Simpan ini sebagai repeat.sh di direktori / dan berikan izin eksekusi. Itu bisa dibunuh dengan menghapus file
Ini berfungsi dengan meletakkan entri di crontab untuk menjalankannya 1 menit kemudian.
sumber
Basis Visual 6 :)
Untuk menjalankan, buat proyek baru, tambahkan modul dengan kode ini, atur objek start-up ke "Sub Main", kompilasi, lalu jalankan executable.
Versi yang lebih mudah dibaca:
sumber
HTML / JAVASCRIPT
FILE HTML a.html
sumber
Pesta
Lebih lama dari seharusnya, tapi saya lelah, dan tidak peduli :)
Anda mengatakan bahwa itu harus memulai ulang sendiri ketika selesai, Anda tidak secara khusus mengatakan bahwa itu harus dilakukan berulang kali, atau tanpa batas. Juga, Anda mengatakan bahwa seharusnya tidak ada dua kejadian berjalan sekaligus ... tidak akan pernah. ;)
Ada banyak cara untuk melakukan ini. Favorit pribadi saya, akan melakukan sesuatu seperti mengirim paket ke suatu tempat yang jauh, dan kemudian (melalui sejumlah metode), memiliki respons yang memicu proses.
sumber
sleep
proses restart ketika selesaiAndroid: Alarm akan memulai kembali Aktivitas setelah 1 detik
sumber
Lingkungan C + MPI
mpifork.c:
Anda harus menginstal OpenMPI atau implementasi MPI lainnya.
Kompilasi denganSekarang saya berpikir tentang itu, tidak ada alasan Anda harus menggunakan mpicc - gcc atau kompiler apa pun yang akan bekerja. Anda hanya perlu memiliki mpirun.Untuk menjalankannya, Anda mungkin harus memasukkan nama path lengkap, dan menyertakan daftar host. Sebagai contoh, saya menambahkan beberapa entri di / etc / hosts yang semuanya menunjuk ke localhost, dan menjalankannya seperti ini:
Eksekusi harus berada di direktori yang sama pada mesin apa pun yang Anda ingin jalankan ini.
Pada dasarnya, ini mengambil daftar host yang disediakan pada baris perintah, memilih salah satu host, dan meluncurkan executable pada host target dengan argumen yang sama. Jika semuanya berjalan dengan sempurna, mpirun akan memanggil dirinya berulang-ulang pada mesin yang berbeda (atau mesin yang sama jika Anda hanya menyediakan 'localhost'. Dapat dieksekusi sendiri (mpifork) tidak berakhir - setelah menelepon
execvp
, itu tidak lagi mengeksekusi pada mesin pertama.Jika Anda ingin menjadi jahat, Anda bisa membuat peluncuran ini di setiap mesin, dengan memasukkan daftar lengkap host yang disediakan pada baris perintah
args
. Itu akan menelurkan salinan sendiri pada setiap mesin, berulang-ulang - sebuah forkbomb cluster.Namun, dalam formulir ini, saya cukup yakin ini memenuhi aturan.
sumber
JavaScript
Tanpa "pergi ke jaringan" bila tidak diperlukan :-) Penjadwalan loop acara JavaScript memungkinkan kita untuk menulis program yang memenuhi persyaratan yang diberikan dengan sangat mudah:
Ini "me-restart"
program
fungsi dengan kecepatan 10 kali per detik. Ini dijamin oleh sifat JavaScript bahwa hanya satu tugas akan berjalan pada saat yang sama, dan itu tidak "restart lingkungan" seperti pada "memuat ulang halaman".sumber
Perakitan x86
Tidak sepenuhnya yakin ini cocok dengan kriteria Anda karena tidak menghasilkan proses baru, tapi ini dia.
Program akan menampilkan kotak pesan, mengalokasikan sebagian memori, menyalin bagian kodenya sendiri ke memori yang dialokasikan, dan kemudian melompat ke lokasi tersebut memulai siklus berulang. Itu harus berjalan sampai malloc gagal.
Disusun dengan fasme.
sumber
@
setelah Anda berhasil, karena saya kemungkinan tidak akan mengawasi itu).Linux pemula baru
Mengingat pembacaan pertanyaan yang paling ketat, saya pikir ini tidak mungkin. Intinya adalah meminta program untuk memulai secara spontan dengan bantuan tidak ada program yang sedang berjalan lainnya.
Ada beberapa jawaban berbasis
at
danchron
, tetapi dengan pembacaan yang ketat,atd
dananacron
merupakan program tambahan yang berjalan sepanjang waktu, sehingga dapat didiskualifikasi.Pendekatan terkait, tetapi level yang sedikit lebih rendah adalah menggunakan Linux
init
. Sebagai root, tambahkan file .conf ini ke/etc/init/
:Kemudian
init
baca kembali file .conf-nya:Ini akan memulai
sleep
proses yang akan hidup selama 10 detik, lalu keluar.init
kemudian akan respawnsleep
setelah mendeteksi yang sebelumnya telah pergi.Tentu saja ini masih digunakan
init
sebagai program pelengkap. Anda bisa berargumen bahwa ituinit
adalah ekstensi logis dari kernel dan akan selalu tersedia di Linux apa pun.Jika ini tidak dapat diterima, maka saya kira hal tingkat bawah berikutnya yang harus dilakukan adalah membuat modul kernel yang respawns proses userspace (tidak yakin betapa mudahnya itu). Di sini dapat diperdebatkan bahwa kernel bukanlah suatu proses, dan karenanya bukan suatu program (tambahan). Di sisi lain, kernel adalah program yang berdiri sendiri, dari sudut CPU.
sumber
TI-BASIC: 5 karakter
sebut itu
prgmA
sumber
:
hanyalah awal dari simbol garis setiap kali Anda pemrograman dalam TI-dasar. Ini bukan sesuatu yang Anda ketik, itu hanya ada di editor.A
dan menggunakan nilai sebagai kasing, Anda akan melihatnya keluar pada akhirnya.